104819bfdSŁukasz Kosmaty #pragma once
204819bfdSŁukasz Kosmaty 
3*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED
4*5f154df9Saleqsio #include <react/renderer/uimanager/UIManager.h>
5*5f154df9Saleqsio #include "NewestShadowNodesRegistry.h"
6*5f154df9Saleqsio #endif
7*5f154df9Saleqsio 
804819bfdSŁukasz Kosmaty #include <memory>
904819bfdSŁukasz Kosmaty #include <string>
10*5f154df9Saleqsio #include <unordered_set>
11*5f154df9Saleqsio #include <utility>
1204819bfdSŁukasz Kosmaty #include <vector>
1304819bfdSŁukasz Kosmaty 
1404819bfdSŁukasz Kosmaty #include "AnimatedSensorModule.h"
1504819bfdSŁukasz Kosmaty #include "ErrorHandler.h"
16*5f154df9Saleqsio #include "LayoutAnimationsManager.h"
1704819bfdSŁukasz Kosmaty #include "NativeReanimatedModuleSpec.h"
1804819bfdSŁukasz Kosmaty #include "PlatformDepMethodsHolder.h"
1904819bfdSŁukasz Kosmaty #include "RuntimeDecorator.h"
2004819bfdSŁukasz Kosmaty #include "RuntimeManager.h"
2104819bfdSŁukasz Kosmaty #include "Scheduler.h"
2204819bfdSŁukasz Kosmaty #include "SingleInstanceChecker.h"
2304819bfdSŁukasz Kosmaty 
2404819bfdSŁukasz Kosmaty namespace reanimated {
2504819bfdSŁukasz Kosmaty 
2604819bfdSŁukasz Kosmaty using FrameCallback = std::function<void(double)>;
2704819bfdSŁukasz Kosmaty 
2804819bfdSŁukasz Kosmaty class EventHandlerRegistry;
2904819bfdSŁukasz Kosmaty 
3004819bfdSŁukasz Kosmaty class NativeReanimatedModule : public NativeReanimatedModuleSpec,
3104819bfdSŁukasz Kosmaty                                public RuntimeManager {
3204819bfdSŁukasz Kosmaty  public:
3304819bfdSŁukasz Kosmaty   NativeReanimatedModule(
34*5f154df9Saleqsio       const std::shared_ptr<CallInvoker> &jsInvoker,
35*5f154df9Saleqsio       const std::shared_ptr<Scheduler> &scheduler,
36*5f154df9Saleqsio       const std::shared_ptr<jsi::Runtime> &rt,
37*5f154df9Saleqsio       const std::shared_ptr<ErrorHandler> &errorHandler,
38*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED
39*5f154df9Saleqsio   // nothing
40*5f154df9Saleqsio #else
4104819bfdSŁukasz Kosmaty       std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)>
4204819bfdSŁukasz Kosmaty           propObtainer,
43*5f154df9Saleqsio #endif
4404819bfdSŁukasz Kosmaty       PlatformDepMethodsHolder platformDepMethodsHolder);
4504819bfdSŁukasz Kosmaty 
46*5f154df9Saleqsio   ~NativeReanimatedModule();
4704819bfdSŁukasz Kosmaty 
48*5f154df9Saleqsio   std::shared_ptr<JSRuntimeHelper> runtimeHelper;
4904819bfdSŁukasz Kosmaty 
50*5f154df9Saleqsio   void installCoreFunctions(
5104819bfdSŁukasz Kosmaty       jsi::Runtime &rt,
52*5f154df9Saleqsio       const jsi::Value &callGuard,
53*5f154df9Saleqsio       const jsi::Value &valueUnpacker) override;
54*5f154df9Saleqsio 
55*5f154df9Saleqsio   jsi::Value makeShareableClone(
56*5f154df9Saleqsio       jsi::Runtime &rt,
57*5f154df9Saleqsio       const jsi::Value &value,
58*5f154df9Saleqsio       const jsi::Value &shouldRetainRemote) override;
59*5f154df9Saleqsio 
60*5f154df9Saleqsio   jsi::Value makeSynchronizedDataHolder(
61*5f154df9Saleqsio       jsi::Runtime &rt,
62*5f154df9Saleqsio       const jsi::Value &initialShareable) override;
63*5f154df9Saleqsio   jsi::Value getDataSynchronously(
64*5f154df9Saleqsio       jsi::Runtime &rt,
65*5f154df9Saleqsio       const jsi::Value &synchronizedDataHolderRef) override;
66*5f154df9Saleqsio   void updateDataSynchronously(
67*5f154df9Saleqsio       jsi::Runtime &rt,
68*5f154df9Saleqsio       const jsi::Value &synchronizedDataHolderRef,
69*5f154df9Saleqsio       const jsi::Value &newData);
70*5f154df9Saleqsio 
71*5f154df9Saleqsio   void scheduleOnUI(jsi::Runtime &rt, const jsi::Value &worklet) override;
7204819bfdSŁukasz Kosmaty 
7304819bfdSŁukasz Kosmaty   jsi::Value registerEventHandler(
7404819bfdSŁukasz Kosmaty       jsi::Runtime &rt,
7504819bfdSŁukasz Kosmaty       const jsi::Value &eventHash,
7604819bfdSŁukasz Kosmaty       const jsi::Value &worklet) override;
7704819bfdSŁukasz Kosmaty   void unregisterEventHandler(
7804819bfdSŁukasz Kosmaty       jsi::Runtime &rt,
7904819bfdSŁukasz Kosmaty       const jsi::Value &registrationId) override;
8004819bfdSŁukasz Kosmaty 
8104819bfdSŁukasz Kosmaty   jsi::Value getViewProp(
8204819bfdSŁukasz Kosmaty       jsi::Runtime &rt,
8304819bfdSŁukasz Kosmaty       const jsi::Value &viewTag,
8404819bfdSŁukasz Kosmaty       const jsi::Value &propName,
8504819bfdSŁukasz Kosmaty       const jsi::Value &callback) override;
8604819bfdSŁukasz Kosmaty 
8704819bfdSŁukasz Kosmaty   jsi::Value enableLayoutAnimations(jsi::Runtime &rt, const jsi::Value &config)
8804819bfdSŁukasz Kosmaty       override;
8904819bfdSŁukasz Kosmaty   jsi::Value configureProps(
9004819bfdSŁukasz Kosmaty       jsi::Runtime &rt,
9104819bfdSŁukasz Kosmaty       const jsi::Value &uiProps,
9204819bfdSŁukasz Kosmaty       const jsi::Value &nativeProps) override;
93*5f154df9Saleqsio   jsi::Value configureLayoutAnimation(
94*5f154df9Saleqsio       jsi::Runtime &rt,
95*5f154df9Saleqsio       const jsi::Value &viewTag,
96*5f154df9Saleqsio       const jsi::Value &type,
97*5f154df9Saleqsio       const jsi::Value &sharedTransitionTag,
98*5f154df9Saleqsio       const jsi::Value &config) override;
9904819bfdSŁukasz Kosmaty 
10004819bfdSŁukasz Kosmaty   void onRender(double timestampMs);
101*5f154df9Saleqsio 
102*5f154df9Saleqsio   void onEvent(
103*5f154df9Saleqsio       double eventTimestamp,
104*5f154df9Saleqsio       const std::string &eventName,
105*5f154df9Saleqsio       const jsi::Value &payload);
106*5f154df9Saleqsio 
10704819bfdSŁukasz Kosmaty   bool isAnyHandlerWaitingForEvent(std::string eventName);
10804819bfdSŁukasz Kosmaty 
10904819bfdSŁukasz Kosmaty   void maybeRequestRender();
110*5f154df9Saleqsio   UpdatePropsFunction updatePropsFunction;
111*5f154df9Saleqsio 
112*5f154df9Saleqsio   bool handleEvent(
113*5f154df9Saleqsio       const std::string &eventName,
114*5f154df9Saleqsio       const jsi::Value &payload,
115*5f154df9Saleqsio       double currentTime);
116*5f154df9Saleqsio 
117*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED
118*5f154df9Saleqsio   bool handleRawEvent(const RawEvent &rawEvent, double currentTime);
119*5f154df9Saleqsio 
120*5f154df9Saleqsio   void updateProps(
121*5f154df9Saleqsio       jsi::Runtime &rt,
122*5f154df9Saleqsio       const jsi::Value &shadowNodeValue,
123*5f154df9Saleqsio       const jsi::Value &props);
124*5f154df9Saleqsio 
125*5f154df9Saleqsio   void removeShadowNodeFromRegistry(jsi::Runtime &rt, const jsi::Value &tag);
126*5f154df9Saleqsio 
127*5f154df9Saleqsio   void performOperations();
128*5f154df9Saleqsio 
129*5f154df9Saleqsio   void dispatchCommand(
130*5f154df9Saleqsio       jsi::Runtime &rt,
131*5f154df9Saleqsio       const jsi::Value &shadowNodeValue,
132*5f154df9Saleqsio       const jsi::Value &commandNameValue,
133*5f154df9Saleqsio       const jsi::Value &argsValue);
134*5f154df9Saleqsio 
135*5f154df9Saleqsio   jsi::Value measure(jsi::Runtime &rt, const jsi::Value &shadowNodeValue);
136*5f154df9Saleqsio 
137*5f154df9Saleqsio   void setUIManager(std::shared_ptr<UIManager> uiManager);
138*5f154df9Saleqsio 
139*5f154df9Saleqsio   void setNewestShadowNodesRegistry(
140*5f154df9Saleqsio       std::shared_ptr<NewestShadowNodesRegistry> newestShadowNodesRegistry);
141*5f154df9Saleqsio #endif
14204819bfdSŁukasz Kosmaty 
14304819bfdSŁukasz Kosmaty   jsi::Value registerSensor(
14404819bfdSŁukasz Kosmaty       jsi::Runtime &rt,
14504819bfdSŁukasz Kosmaty       const jsi::Value &sensorType,
14604819bfdSŁukasz Kosmaty       const jsi::Value &interval,
147*5f154df9Saleqsio       const jsi::Value &iosReferenceFrame,
14804819bfdSŁukasz Kosmaty       const jsi::Value &sensorDataContainer) override;
14904819bfdSŁukasz Kosmaty   void unregisterSensor(jsi::Runtime &rt, const jsi::Value &sensorId) override;
150*5f154df9Saleqsio 
151*5f154df9Saleqsio   void cleanupSensors();
152*5f154df9Saleqsio 
15304819bfdSŁukasz Kosmaty   jsi::Value subscribeForKeyboardEvents(
15404819bfdSŁukasz Kosmaty       jsi::Runtime &rt,
155*5f154df9Saleqsio       const jsi::Value &keyboardEventContainer,
156*5f154df9Saleqsio       const jsi::Value &isStatusBarTranslucent) override;
15704819bfdSŁukasz Kosmaty   void unsubscribeFromKeyboardEvents(
15804819bfdSŁukasz Kosmaty       jsi::Runtime &rt,
15904819bfdSŁukasz Kosmaty       const jsi::Value &listenerId) override;
16004819bfdSŁukasz Kosmaty 
layoutAnimationsManager()161*5f154df9Saleqsio   inline LayoutAnimationsManager &layoutAnimationsManager() {
162*5f154df9Saleqsio     return layoutAnimationsManager_;
163*5f154df9Saleqsio   }
164*5f154df9Saleqsio 
16504819bfdSŁukasz Kosmaty  private:
166*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED
167*5f154df9Saleqsio   bool isThereAnyLayoutProp(jsi::Runtime &rt, const jsi::Value &props);
168*5f154df9Saleqsio #endif // RCT_NEW_ARCH_ENABLED
169*5f154df9Saleqsio 
170*5f154df9Saleqsio   std::unique_ptr<EventHandlerRegistry> eventHandlerRegistry;
17104819bfdSŁukasz Kosmaty   std::function<void(FrameCallback &, jsi::Runtime &)> requestRender;
17204819bfdSŁukasz Kosmaty   std::vector<FrameCallback> frameCallbacks;
17304819bfdSŁukasz Kosmaty   bool renderRequested = false;
17404819bfdSŁukasz Kosmaty   std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)>
17504819bfdSŁukasz Kosmaty       propObtainer;
17604819bfdSŁukasz Kosmaty   std::function<void(double)> onRenderCallback;
17704819bfdSŁukasz Kosmaty   AnimatedSensorModule animatedSensorModule;
17804819bfdSŁukasz Kosmaty   ConfigurePropsFunction configurePropsPlatformFunction;
179*5f154df9Saleqsio 
180*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED
181*5f154df9Saleqsio   SynchronouslyUpdateUIPropsFunction synchronouslyUpdateUIPropsFunction;
182*5f154df9Saleqsio 
183*5f154df9Saleqsio   std::shared_ptr<UIManager> uiManager_;
184*5f154df9Saleqsio 
185*5f154df9Saleqsio   // After app reload, surfaceId on iOS is still 1 but on Android it's 11.
186*5f154df9Saleqsio   // We can store surfaceId of the most recent ShadowNode as a workaround.
187*5f154df9Saleqsio   SurfaceId surfaceId_ = -1;
188*5f154df9Saleqsio 
189*5f154df9Saleqsio   std::vector<std::pair<ShadowNode::Shared, std::unique_ptr<jsi::Value>>>
190*5f154df9Saleqsio       operationsInBatch_; // TODO: refactor std::pair to custom struct
191*5f154df9Saleqsio 
192*5f154df9Saleqsio   std::shared_ptr<NewestShadowNodesRegistry> newestShadowNodesRegistry_;
193*5f154df9Saleqsio 
194*5f154df9Saleqsio   std::vector<Tag> tagsToRemove_; // from newestShadowNodesRegistry_
195*5f154df9Saleqsio #endif
196*5f154df9Saleqsio 
197*5f154df9Saleqsio   std::unordered_set<std::string> nativePropNames_; // filled by configureProps
198*5f154df9Saleqsio   LayoutAnimationsManager layoutAnimationsManager_;
199*5f154df9Saleqsio 
20004819bfdSŁukasz Kosmaty   KeyboardEventSubscribeFunction subscribeForKeyboardEventsFunction;
20104819bfdSŁukasz Kosmaty   KeyboardEventUnsubscribeFunction unsubscribeFromKeyboardEventsFunction;
20204819bfdSŁukasz Kosmaty 
20304819bfdSŁukasz Kosmaty #ifdef DEBUG
20404819bfdSŁukasz Kosmaty   SingleInstanceChecker<NativeReanimatedModule> singleInstanceChecker_;
20504819bfdSŁukasz Kosmaty #endif
20604819bfdSŁukasz Kosmaty };
20704819bfdSŁukasz Kosmaty 
20804819bfdSŁukasz Kosmaty } // namespace reanimated
209