• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "js_ui_observer.h"
17 #include "ui_observer.h"
18 
19 
20 #include "interfaces/napi/kits/utils/napi_utils.h"
21 
22 
23 namespace OHOS::Ace::Napi {
24 namespace {
25 #define GET_PARAMS(env, info, max) \
26     size_t argc = max;             \
27     napi_value argv[max] = { 0 };  \
28     napi_value thisVar = nullptr;  \
29     void* data;                    \
30     napi_get_cb_info(env, info, &argc, argv, &thisVar, &data)
31 
32 static constexpr uint32_t PARAM_SIZE_ONE = 1;
33 static constexpr uint32_t PARAM_SIZE_TWO = 2;
34 static constexpr uint32_t PARAM_SIZE_THREE = 3;
35 static constexpr uint32_t PARAM_SIZE_FOUR = 4;
36 
37 static constexpr size_t PARAM_INDEX_ZERO = 0;
38 static constexpr size_t PARAM_INDEX_ONE = 1;
39 static constexpr size_t PARAM_INDEX_TWO = 2;
40 static constexpr size_t PARAM_INDEX_THREE = 3;
41 
42 static constexpr uint32_t ON_SHOWN = 0;
43 static constexpr uint32_t ON_HIDDEN = 1;
44 static constexpr uint32_t ON_APPEAR = 2;
45 static constexpr uint32_t ON_DISAPPEAR = 3;
46 static constexpr uint32_t ON_WILL_SHOW = 4;
47 static constexpr uint32_t ON_WILL_HIDE = 5;
48 static constexpr uint32_t ON_WILL_APPEAR = 6;
49 static constexpr uint32_t ON_WILL_DISAPPEAR = 7;
50 static constexpr uint32_t ON_ACTIVE = 8;
51 static constexpr uint32_t ON_INACTIVE = 9;
52 static constexpr uint32_t ON_BACKPRESS = 100;
53 
54 static constexpr uint32_t SCROLL_START = 0;
55 static constexpr uint32_t SCROLL_STOP = 1;
56 
57 static constexpr uint32_t ABOUT_TO_APPEAR = 0;
58 static constexpr uint32_t ABOUT_TO_DISAPPEAR = 1;
59 static constexpr uint32_t ON_PAGE_SHOW = 2;
60 static constexpr uint32_t ON_PAGE_HIDE = 3;
61 static constexpr uint32_t ON_BACK_PRESS = 4;
62 
63 static constexpr uint32_t ON_SHOW = 0;
64 static constexpr uint32_t ON_HIDE = 1;
65 
66 static constexpr uint32_t TAP_GESTURE = 0;
67 static constexpr uint32_t LONG_PRESS_GESTURE = 1;
68 static constexpr uint32_t PAN_GESTURE = 2;
69 static constexpr uint32_t PINCH_GESTURE = 3;
70 static constexpr uint32_t SWIPE_GESTURE = 4;
71 static constexpr uint32_t ROTATION_GESTURE = 5;
72 static constexpr uint32_t DRAG = 6;
73 static constexpr uint32_t CLICK = 7;
74 
75 static constexpr uint32_t READY = 0;
76 static constexpr uint32_t DETECTING = 1;
77 static constexpr uint32_t PENDING = 2;
78 static constexpr uint32_t BLOCKED = 3;
79 static constexpr uint32_t SUCCESSFUL = 4;
80 static constexpr uint32_t FAILED = 5;
81 
82 constexpr char NAVDESTINATION_UPDATE[] = "navDestinationUpdate";
83 constexpr char ROUTERPAGE_UPDATE[] = "routerPageUpdate";
84 constexpr char SCROLL_EVENT[] = "scrollEvent";
85 constexpr char DENSITY_UPDATE[] = "densityUpdate";
86 constexpr char LAYOUT_DONE[] = "didLayout";
87 constexpr char DRAW_COMMAND_SEND[] = "willDraw";
88 constexpr char NAVDESTINATION_SWITCH[] = "navDestinationSwitch";
89 constexpr char WILLCLICK_UPDATE[] = "willClick";
90 constexpr char DIDCLICK_UPDATE[] = "didClick";
91 constexpr char TAB_CONTENT_STATE[] = "tabContentUpdate";
92 constexpr char BEFORE_PAN_START[] = "beforePanStart";
93 constexpr char BEFORE_PAN_END[] = "beforePanEnd";
94 constexpr char AFTER_PAN_START[] = "afterPanStart";
95 constexpr char AFTER_PAN_END[] = "afterPanEnd";
96 
IsUIAbilityContext(napi_env env,napi_value context)97 bool IsUIAbilityContext(napi_env env, napi_value context)
98 {
99     napi_value abilityInfo = nullptr;
100     napi_get_named_property(env, context, "abilityInfo", &abilityInfo);
101     if (!abilityInfo) {
102         return false;
103     }
104     napi_value abilityInfoName = nullptr;
105     napi_get_named_property(env, abilityInfo, "name", &abilityInfoName);
106     if (abilityInfoName) {
107         return true;
108     }
109     return false;
110 }
111 
GetUIContextInstanceId(napi_env env,napi_value uiContext)112 int32_t GetUIContextInstanceId(napi_env env, napi_value uiContext)
113 {
114     int32_t result = 0;
115     if (IsUIAbilityContext(env, uiContext)) {
116         return result;
117     }
118     napi_value instanceId = nullptr;
119     napi_get_named_property(env, uiContext, "instanceId_", &instanceId);
120     napi_get_value_int32(env, instanceId, &result);
121     return result;
122 }
123 
MatchValueType(napi_env env,napi_value value,napi_valuetype targetType)124 bool MatchValueType(napi_env env, napi_value value, napi_valuetype targetType)
125 {
126     napi_valuetype valueType = napi_undefined;
127     napi_typeof(env, value, &valueType);
128     return valueType == targetType;
129 }
130 
ParseStringFromNapi(napi_env env,napi_value val,std::string & str)131 bool ParseStringFromNapi(napi_env env, napi_value val, std::string& str)
132 {
133     napi_valuetype type;
134     return GetNapiString(env, val, str, type);
135 }
136 
ParseNavigationId(napi_env env,napi_value obj,std::string & navigationStr)137 bool ParseNavigationId(napi_env env, napi_value obj, std::string& navigationStr)
138 {
139     napi_value navigationId = nullptr;
140     napi_get_named_property(env, obj, "navigationId", &navigationId);
141     return ParseStringFromNapi(env, navigationId, navigationStr);
142 }
143 
ParseScrollId(napi_env env,napi_value obj,std::string & result)144 bool ParseScrollId(napi_env env, napi_value obj, std::string& result)
145 {
146     napi_value resultId = nullptr;
147     napi_get_named_property(env, obj, "id", &resultId);
148     if (!MatchValueType(env, resultId, napi_string)) {
149         return false;
150     }
151     return ParseStringFromNapi(env, resultId, result);
152 }
153 
IsNavDestSwitchOptions(napi_env env,napi_value obj,std::string & navigationId)154 bool IsNavDestSwitchOptions(napi_env env, napi_value obj, std::string& navigationId)
155 {
156     if (!MatchValueType(env, obj, napi_object)) {
157         return false;
158     }
159     napi_value navId = nullptr;
160     napi_get_named_property(env, obj, "navigationId", &navId);
161     return ParseStringFromNapi(env, navId, navigationId);
162 }
163 
164 struct NavDestinationSwitchParams {
165     bool isUIContext = true;
166     std::optional<std::string> navigationId;
167     napi_value callback = nullptr;
168     napi_value abilityUIContext = nullptr;
169     int32_t uiContextInstanceId = 0;
170 };
171 
ParseNavDestSwitchRegisterParams(napi_env env,napi_callback_info info,NavDestinationSwitchParams & params)172 bool ParseNavDestSwitchRegisterParams(napi_env env, napi_callback_info info, NavDestinationSwitchParams& params)
173 {
174     GET_PARAMS(env, info, PARAM_SIZE_FOUR);
175 
176     auto& secondArg = argv[PARAM_INDEX_ONE];
177     auto& thirdArg = argv[PARAM_INDEX_TWO];
178     auto& fourthArg = argv[PARAM_INDEX_THREE];
179     std::string navigationId;
180     if (argc == PARAM_SIZE_TWO && MatchValueType(env, secondArg, napi_function)) {
181         // js code: UIObserver.on('navDestinationSwitch', callback)
182         params.callback = secondArg;
183     } else if (argc == PARAM_SIZE_THREE && MatchValueType(env, secondArg, napi_object) &&
184         MatchValueType(env, thirdArg, napi_function)) {
185         if (IsNavDestSwitchOptions(env, secondArg, navigationId)) {
186             // js code: UIObserver.on('navDestinationSwitch', { navigationId: navId }, callback)
187             params.navigationId = navigationId;
188         } else if (IsUIAbilityContext(env, secondArg)) {
189             // js code: observer.on('navDestinationSwitch', AbilityUIContext, callback)
190             params.isUIContext = false;
191             params.abilityUIContext = secondArg;
192         } else {
193             // js code: observer.on('navDestinationSwitch', UIContext, callback)
194             params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
195         }
196         params.callback = thirdArg;
197     } else if (argc == PARAM_SIZE_FOUR && MatchValueType(env, secondArg, napi_object) &&
198         IsNavDestSwitchOptions(env, thirdArg, navigationId) &&
199         MatchValueType(env, fourthArg, napi_function)) {
200         if (IsUIAbilityContext(env, secondArg)) {
201             // js code: observer.on('navDestinationSwitch', AbilityUIContext, { navigationId: navId }, callback)
202             params.isUIContext = false;
203             params.abilityUIContext = secondArg;
204         } else {
205             // js code: observer.on('navDestinationSwitch', UIContext, { navigationId: navId }, callback)
206             params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
207         }
208         params.navigationId = navigationId;
209         params.callback = fourthArg;
210     } else {
211         return false;
212     }
213 
214     return true;
215 }
216 
ParseNavDestSwitchUnRegisterParams(napi_env env,napi_value secondArg,NavDestinationSwitchParams & params)217 bool ParseNavDestSwitchUnRegisterParams(
218     napi_env env, napi_value secondArg, NavDestinationSwitchParams& params)
219 {
220     std::string navigationId;
221     if (MatchValueType(env, secondArg, napi_function)) {
222         // js code: UIObserver.off('navDestinationSwitch', callback)
223         params.callback = secondArg;
224     } else if (IsNavDestSwitchOptions(env, secondArg, navigationId)) {
225         // js code: UIObserver.off('navDestinationSwitch', { navigationId: navId })
226         params.navigationId = navigationId;
227     } else if (MatchValueType(env, secondArg, napi_object)) {
228         if (IsUIAbilityContext(env, secondArg)) {
229             // js code: observer.off('navDestinationSwitch', AbilityUIContext)
230             params.isUIContext = false;
231             params.abilityUIContext = secondArg;
232         } else {
233             // js code: observer.off('navDestinationSwitch', UIContext)
234             params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
235         }
236     } else {
237         return false;
238     }
239 
240     return true;
241 }
242 
ParseNavDestSwitchUnRegisterParams(napi_env env,napi_value secondArg,napi_value thirdArg,NavDestinationSwitchParams & params)243 bool ParseNavDestSwitchUnRegisterParams(
244     napi_env env, napi_value secondArg, napi_value thirdArg, NavDestinationSwitchParams& params)
245 {
246     std::string navigationId;
247     if (MatchValueType(env, thirdArg, napi_function)) {
248         params.callback = thirdArg;
249         if (IsNavDestSwitchOptions(env, secondArg, navigationId)) {
250             // js code: UIObserver.off('navDestinationSwitch', { navigationId: navId }, callback)
251             params.navigationId = navigationId;
252         } else if (MatchValueType(env, secondArg, napi_object)) {
253             if (IsUIAbilityContext(env, secondArg)) {
254                 // js code: observer.off('navDestinationSwitch', AbilityUIContext, callback)
255                 params.isUIContext = false;
256                 params.abilityUIContext = secondArg;
257             } else {
258                 // js code: observer.off('navDestinationSwitch', UIContext, callback)
259                 params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
260             }
261         } else {
262             return false;
263         }
264     } else if (MatchValueType(env, secondArg, napi_object) &&
265         IsNavDestSwitchOptions(env, thirdArg, navigationId)) {
266         if (IsUIAbilityContext(env, secondArg)) {
267             // js code: observer.off('navDestinationSwitch', AbilityUIContext, { navigationId: navId })
268             params.isUIContext = false;
269             params.abilityUIContext = secondArg;
270         } else {
271             // js code: observer.off('navDestinationSwitch', UIContext, { navigationId: navId })
272             params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
273         }
274         params.navigationId = navigationId;
275     } else {
276         return false;
277     }
278 
279     return true;
280 }
281 
ParseNavDestSwitchUnRegisterParams(napi_env env,napi_value secondArg,napi_value thirdArg,napi_value fourthArg,NavDestinationSwitchParams & params)282 bool ParseNavDestSwitchUnRegisterParams(
283     napi_env env, napi_value secondArg, napi_value thirdArg,
284     napi_value fourthArg, NavDestinationSwitchParams& params)
285 {
286     std::string navigationId;
287     auto& context = secondArg;
288     auto& options = thirdArg;
289     auto& callback = fourthArg;
290     if (MatchValueType(env, context, napi_object) &&
291         IsNavDestSwitchOptions(env, options, navigationId) &&
292         MatchValueType(env, callback, napi_function)) {
293         if (IsUIAbilityContext(env, context)) {
294             // js code: observer.off('navDestinationSwitch', AbilityUIContext, { navigationId: navId }, callback)
295             params.isUIContext = false;
296             params.abilityUIContext = context;
297         } else {
298             // js code: observer.off('navDestinationSwitch', UIContext, { navigationId: navId }, callback)
299             params.uiContextInstanceId = GetUIContextInstanceId(env, context);
300         }
301         params.navigationId = navigationId;
302         params.callback = callback;
303         return true;
304     }
305 
306     return false;
307 }
308 
ParseNavDestSwitchUnRegisterParams(napi_env env,napi_callback_info info,NavDestinationSwitchParams & params)309 bool ParseNavDestSwitchUnRegisterParams(
310     napi_env env, napi_callback_info info, NavDestinationSwitchParams& params)
311 {
312     GET_PARAMS(env, info, PARAM_SIZE_FOUR);
313 
314     if (argc == PARAM_SIZE_TWO) {
315         return ParseNavDestSwitchUnRegisterParams(env, argv[PARAM_INDEX_ONE], params);
316     } else if (argc == PARAM_SIZE_THREE) {
317         return ParseNavDestSwitchUnRegisterParams(env, argv[PARAM_INDEX_ONE], argv[PARAM_INDEX_TWO], params);
318     } else if (argc == PARAM_SIZE_FOUR) {
319         return ParseNavDestSwitchUnRegisterParams(
320             env, argv[PARAM_INDEX_ONE], argv[PARAM_INDEX_TWO], argv[PARAM_INDEX_THREE], params);
321     } else if (argc != PARAM_SIZE_ONE) {
322         return false;
323     }
324 
325     return true;
326 }
327 } // namespace
328 
ObserverProcess()329 ObserverProcess::ObserverProcess()
330 {
331     registerProcessMap_ = {
332         { NAVDESTINATION_UPDATE, &ObserverProcess::ProcessNavigationRegister },
333         { SCROLL_EVENT, &ObserverProcess::ProcessScrollEventRegister },
334         { ROUTERPAGE_UPDATE, &ObserverProcess::ProcessRouterPageRegister },
335         { DENSITY_UPDATE, &ObserverProcess::ProcessDensityRegister },
336         { LAYOUT_DONE, &ObserverProcess::ProcessLayoutDoneRegister },
337         { DRAW_COMMAND_SEND, &ObserverProcess::ProcessDrawCommandSendRegister },
338         { NAVDESTINATION_SWITCH, &ObserverProcess::ProcessNavDestinationSwitchRegister },
339         { WILLCLICK_UPDATE, &ObserverProcess::ProcessWillClickRegister },
340         { DIDCLICK_UPDATE, &ObserverProcess::ProcessDidClickRegister },
341         { TAB_CONTENT_STATE, &ObserverProcess::ProcessTabContentStateRegister },
342         { BEFORE_PAN_START, &ObserverProcess::ProcessBeforePanStartRegister },
343         { AFTER_PAN_START, &ObserverProcess::ProcessAfterPanStartRegister },
344         { BEFORE_PAN_END, &ObserverProcess::ProcessBeforePanEndRegister },
345         { AFTER_PAN_END, &ObserverProcess::ProcessAfterPanEndRegister },
346     };
347     unregisterProcessMap_ = {
348         { NAVDESTINATION_UPDATE, &ObserverProcess::ProcessNavigationUnRegister },
349         { SCROLL_EVENT, &ObserverProcess::ProcessScrollEventUnRegister },
350         { ROUTERPAGE_UPDATE, &ObserverProcess::ProcessRouterPageUnRegister },
351         { DENSITY_UPDATE, &ObserverProcess::ProcessDensityUnRegister },
352         { LAYOUT_DONE, &ObserverProcess::ProcessLayoutDoneUnRegister },
353         { DRAW_COMMAND_SEND, &ObserverProcess::ProcessDrawCommandSendUnRegister},
354         { NAVDESTINATION_SWITCH, &ObserverProcess::ProcessNavDestinationSwitchUnRegister },
355         { WILLCLICK_UPDATE, &ObserverProcess::ProcessWillClickUnRegister },
356         { DIDCLICK_UPDATE, &ObserverProcess::ProcessDidClickUnRegister },
357         { TAB_CONTENT_STATE, &ObserverProcess::ProcessTabContentStateUnRegister },
358         { BEFORE_PAN_START, &ObserverProcess::ProcessBeforePanStartUnRegister },
359         { AFTER_PAN_START, &ObserverProcess::ProcessAfterPanStartUnRegister },
360         { BEFORE_PAN_END, &ObserverProcess::ProcessBeforePanEndUnRegister },
361         { AFTER_PAN_END, &ObserverProcess::ProcessAfterPanEndUnRegister },
362     };
363 }
364 
GetInstance()365 ObserverProcess& ObserverProcess::GetInstance()
366 {
367     static ObserverProcess instance;
368     return instance;
369 }
370 
ProcessRegister(napi_env env,napi_callback_info info)371 napi_value ObserverProcess::ProcessRegister(napi_env env, napi_callback_info info)
372 {
373     GET_PARAMS(env, info, PARAM_SIZE_THREE);
374     NAPI_ASSERT(env, (argc >= PARAM_SIZE_TWO && thisVar != nullptr), "Invalid arguments");
375     std::string type;
376     if (!ParseStringFromNapi(env, argv[PARAM_INDEX_ZERO], type)) {
377         return nullptr;
378     }
379     auto it = registerProcessMap_.find(type);
380     if (it == registerProcessMap_.end()) {
381         return nullptr;
382     }
383     return (this->*(it->second))(env, info);
384 }
385 
ProcessUnRegister(napi_env env,napi_callback_info info)386 napi_value ObserverProcess::ProcessUnRegister(napi_env env, napi_callback_info info)
387 {
388     GET_PARAMS(env, info, PARAM_SIZE_THREE);
389     NAPI_ASSERT(env, (argc >= PARAM_SIZE_ONE && thisVar != nullptr), "Invalid arguments");
390     std::string type;
391     if (!ParseStringFromNapi(env, argv[PARAM_INDEX_ZERO], type)) {
392         return nullptr;
393     }
394     auto it = unregisterProcessMap_.find(type);
395     if (it == unregisterProcessMap_.end()) {
396         return nullptr;
397     }
398     return (this->*(it->second))(env, info);
399 }
400 
ProcessNavigationRegister(napi_env env,napi_callback_info info)401 napi_value ObserverProcess::ProcessNavigationRegister(napi_env env, napi_callback_info info)
402 {
403     GET_PARAMS(env, info, PARAM_SIZE_THREE);
404 
405     if (!isNavigationHandleFuncSetted_) {
406         NG::UIObserverHandler::GetInstance().SetHandleNavigationChangeFunc(&UIObserver::HandleNavigationStateChange);
407         isNavigationHandleFuncSetted_ = true;
408     }
409 
410     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
411         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
412         UIObserver::RegisterNavigationCallback(listener);
413     }
414 
415     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
416         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
417         std::string id;
418         if (ParseNavigationId(env, argv[PARAM_INDEX_ONE], id)) {
419             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
420             UIObserver::RegisterNavigationCallback(id, listener);
421         }
422     }
423 
424     napi_value result = nullptr;
425     return result;
426 }
427 
ProcessNavigationUnRegister(napi_env env,napi_callback_info info)428 napi_value ObserverProcess::ProcessNavigationUnRegister(napi_env env, napi_callback_info info)
429 {
430     GET_PARAMS(env, info, PARAM_SIZE_THREE);
431 
432     if (argc == PARAM_SIZE_ONE) {
433         UIObserver::UnRegisterNavigationCallback(nullptr);
434     }
435 
436     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
437         UIObserver::UnRegisterNavigationCallback(argv[PARAM_INDEX_ONE]);
438     }
439 
440     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
441         std::string id;
442         if (ParseNavigationId(env, argv[PARAM_INDEX_ONE], id)) {
443             UIObserver::UnRegisterNavigationCallback(id, nullptr);
444         }
445     }
446 
447     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
448         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
449         std::string id;
450         if (ParseNavigationId(env, argv[PARAM_INDEX_ONE], id)) {
451             UIObserver::UnRegisterNavigationCallback(id, argv[PARAM_INDEX_TWO]);
452         }
453     }
454 
455     napi_value result = nullptr;
456     return result;
457 }
458 
ProcessScrollEventRegister(napi_env env,napi_callback_info info)459 napi_value ObserverProcess::ProcessScrollEventRegister(napi_env env, napi_callback_info info)
460 {
461     GET_PARAMS(env, info, PARAM_SIZE_THREE);
462 
463     if (!isScrollEventChangeFuncSetted_) {
464         NG::UIObserverHandler::GetInstance().SetHandleScrollEventChangeFunc(&UIObserver::HandleScrollEventStateChange);
465         isScrollEventChangeFuncSetted_ = true;
466     }
467     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
468         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
469         UIObserver::RegisterScrollEventCallback(listener);
470     }
471 
472     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)
473         && MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
474         std::string id;
475         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
476             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
477             UIObserver::RegisterScrollEventCallback(id, listener);
478         }
479     }
480 
481     napi_value result = nullptr;
482     return result;
483 }
484 
ProcessScrollEventUnRegister(napi_env env,napi_callback_info info)485 napi_value ObserverProcess::ProcessScrollEventUnRegister(napi_env env, napi_callback_info info)
486 {
487     GET_PARAMS(env, info, PARAM_SIZE_THREE);
488 
489     if (argc == PARAM_SIZE_ONE) {
490         UIObserver::UnRegisterScrollEventCallback(nullptr);
491     }
492 
493     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
494         UIObserver::UnRegisterScrollEventCallback(argv[PARAM_INDEX_ONE]);
495     }
496 
497     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
498         std::string id;
499         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
500             UIObserver::UnRegisterScrollEventCallback(id, nullptr);
501         }
502     }
503 
504     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)
505         && MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
506         std::string id;
507         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
508             UIObserver::UnRegisterScrollEventCallback(id, argv[PARAM_INDEX_TWO]);
509         }
510     }
511 
512     napi_value result = nullptr;
513     return result;
514 }
515 
ProcessRouterPageRegister(napi_env env,napi_callback_info info)516 napi_value ObserverProcess::ProcessRouterPageRegister(napi_env env, napi_callback_info info)
517 {
518     GET_PARAMS(env, info, PARAM_SIZE_THREE);
519 
520     if (!isRouterPageHandleFuncSetted_) {
521         NG::UIObserverHandler::GetInstance().SetHandleRouterPageChangeFunc(&UIObserver::HandleRouterPageStateChange);
522         isRouterPageHandleFuncSetted_ = true;
523     }
524 
525     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
526         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
527         UIObserver::RegisterRouterPageCallback(0, listener);
528     }
529 
530     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
531         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
532         auto context = argv[PARAM_INDEX_ONE];
533         if (context) {
534             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
535             if (IsUIAbilityContext(env, context)) {
536                 UIObserver::RegisterRouterPageCallback(env, context, listener);
537             } else {
538                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
539                 UIObserver::RegisterRouterPageCallback(uiContextInstanceId, listener);
540             }
541         }
542     }
543 
544     napi_value result = nullptr;
545     return result;
546 }
547 
ProcessRouterPageUnRegister(napi_env env,napi_callback_info info)548 napi_value ObserverProcess::ProcessRouterPageUnRegister(napi_env env, napi_callback_info info)
549 {
550     GET_PARAMS(env, info, PARAM_SIZE_THREE);
551 
552     if (argc == PARAM_SIZE_ONE) {
553         UIObserver::UnRegisterRouterPageCallback(0, nullptr);
554     }
555 
556     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
557         UIObserver::UnRegisterRouterPageCallback(0, argv[PARAM_INDEX_ONE]);
558     }
559 
560     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
561         napi_value context = argv[PARAM_INDEX_ONE];
562         if (context) {
563             if (IsUIAbilityContext(env, context)) {
564                 UIObserver::UnRegisterRouterPageCallback(env, context, nullptr);
565             } else {
566                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
567                 UIObserver::UnRegisterRouterPageCallback(uiContextInstanceId, nullptr);
568             }
569         }
570     }
571 
572     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
573         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
574         napi_value context = argv[PARAM_INDEX_ONE];
575         if (context) {
576             if (IsUIAbilityContext(env, context)) {
577                 UIObserver::UnRegisterRouterPageCallback(env, context, argv[PARAM_INDEX_TWO]);
578             } else {
579                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
580                 UIObserver::UnRegisterRouterPageCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
581             }
582         }
583     }
584 
585     napi_value result = nullptr;
586     return result;
587 }
588 
ProcessDensityRegister(napi_env env,napi_callback_info info)589 napi_value ObserverProcess::ProcessDensityRegister(napi_env env, napi_callback_info info)
590 {
591     GET_PARAMS(env, info, PARAM_SIZE_THREE);
592 
593     if (!isDensityChangeSetted_) {
594         NG::UIObserverHandler::GetInstance().SetHandleDensityChangeFunc(&UIObserver::HandleDensityChange);
595         isDensityChangeSetted_ = true;
596     }
597     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
598         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
599         int32_t instanceId = ContainerScope::CurrentId();
600         UIObserver::RegisterDensityCallback(instanceId, listener);
601     }
602 
603     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
604         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
605         auto context = argv[PARAM_INDEX_ONE];
606         if (context) {
607             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
608             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
609             UIObserver::RegisterDensityCallback(uiContextInstanceId, listener);
610         }
611     }
612 
613     napi_value result = nullptr;
614     return result;
615 }
616 
ProcessDensityUnRegister(napi_env env,napi_callback_info info)617 napi_value ObserverProcess::ProcessDensityUnRegister(napi_env env, napi_callback_info info)
618 {
619     GET_PARAMS(env, info, PARAM_SIZE_THREE);
620 
621     if (argc == PARAM_SIZE_ONE) {
622         int32_t instanceId = ContainerScope::CurrentId();
623         UIObserver::UnRegisterDensityCallback(instanceId, nullptr);
624     }
625 
626     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
627         napi_value context = argv[PARAM_INDEX_ONE];
628         if (context) {
629             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
630             UIObserver::UnRegisterDensityCallback(uiContextInstanceId, nullptr);
631         }
632     }
633 
634     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
635         int32_t instanceId = ContainerScope::CurrentId();
636         UIObserver::UnRegisterDensityCallback(instanceId, argv[PARAM_INDEX_ONE]);
637     }
638 
639     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
640         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
641         napi_value context = argv[PARAM_INDEX_ONE];
642         if (context) {
643             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
644             UIObserver::UnRegisterDensityCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
645         }
646     }
647 
648     napi_value result = nullptr;
649     return result;
650 }
651 
ProcessDrawCommandSendRegister(napi_env env,napi_callback_info info)652 napi_value ObserverProcess::ProcessDrawCommandSendRegister(napi_env env, napi_callback_info info)
653 {
654     GET_PARAMS(env, info, 3); // 3: Param Size Three
655 
656     if (!isDrawCommandSendChangeSetted_) {
657         NG::UIObserverHandler::GetInstance().SetDrawCommandSendHandleFunc(&UIObserver::HandDrawCommandSendChange);
658         isDrawCommandSendChangeSetted_ = true;
659     }
660 
661     if (argc == 2 && MatchValueType(env, argv[1], napi_function)) { // 2: Param Size Two
662         auto listener = std::make_shared<UIObserverListener>(env, argv[1]);
663         int32_t instanceId = ContainerScope::CurrentId();
664         UIObserver::RegisterDrawCallback(instanceId, listener);
665     }
666     if (argc == 3 && MatchValueType(env, argv[1], napi_object) && // 3: Param Size Three
667         MatchValueType(env, argv[2], napi_function)) { // 2: Param Index Two
668         auto context = argv[1];
669         if (context) {
670             auto listener = std::make_shared<UIObserverListener>(env, argv[2]); // 2: Param Index Two
671             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
672             UIObserver::RegisterDrawCallback(uiContextInstanceId, listener);
673         }
674     }
675     napi_value result = nullptr;
676     return result;
677 }
678 
ProcessDrawCommandSendUnRegister(napi_env env,napi_callback_info info)679 napi_value ObserverProcess::ProcessDrawCommandSendUnRegister(napi_env env, napi_callback_info info)
680 {
681     GET_PARAMS(env, info, 3); // 3: Param Size Three
682 
683     if (argc == 1) {
684         int32_t instanceId = ContainerScope::CurrentId();
685         UIObserver::UnRegisterDrawCallback(instanceId, nullptr);
686     }
687 
688     if (argc == 2 && MatchValueType(env, argv[1], napi_object)) { // 2: Param Size Two
689         napi_value context = argv[1];
690         if (context) {
691             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
692             UIObserver::UnRegisterDrawCallback(uiContextInstanceId, nullptr);
693         }
694     }
695 
696     if (argc == 2 && MatchValueType(env, argv[1], napi_function)) { // 2: Param Size Two
697         int32_t instanceId = ContainerScope::CurrentId();
698         UIObserver::UnRegisterDrawCallback(instanceId, argv[1]);
699     }
700 
701     if (argc == 3 && MatchValueType(env, argv[1], napi_object) && // 3: Param Size Three
702         MatchValueType(env, argv[2], napi_function)) { // 2: Param Index Two
703         napi_value context = argv[1];
704         if (context) {
705             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
706             UIObserver::UnRegisterDrawCallback(uiContextInstanceId, argv[2]); // 2: Param Index Two
707         }
708     }
709 
710     napi_value result = nullptr;
711     return result;
712 }
713 
ProcessLayoutDoneRegister(napi_env env,napi_callback_info info)714 napi_value ObserverProcess::ProcessLayoutDoneRegister(napi_env env, napi_callback_info info)
715 {
716     GET_PARAMS(env, info, 3); // 3: Param Size Three
717 
718     if (!isLayoutDoneChangeSetted_) {
719         NG::UIObserverHandler::GetInstance().SetLayoutDoneHandleFunc(&UIObserver::HandLayoutDoneChange);
720         isLayoutDoneChangeSetted_ = true;
721     }
722 
723     if (argc == 2 && MatchValueType(env, argv[1], napi_function)) { // 2: Param Size Two
724         auto listener = std::make_shared<UIObserverListener>(env, argv[1]);
725         int32_t instanceId = ContainerScope::CurrentId();
726         UIObserver::RegisterLayoutCallback(instanceId, listener);
727     }
728     if (argc == 3 && MatchValueType(env, argv[1], napi_object) && // 3: Param Size Three
729         MatchValueType(env, argv[2], napi_function)) { // 2: Param Index Two
730         auto context = argv[1];
731         if (context) {
732             auto listener = std::make_shared<UIObserverListener>(env, argv[2]); // 2: Param Index Two
733             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
734             UIObserver::RegisterLayoutCallback(uiContextInstanceId, listener);
735         }
736     }
737     napi_value result = nullptr;
738     return result;
739 }
740 
ProcessLayoutDoneUnRegister(napi_env env,napi_callback_info info)741 napi_value ObserverProcess::ProcessLayoutDoneUnRegister(napi_env env, napi_callback_info info)
742 {
743     GET_PARAMS(env, info, 3); // 3: Param Size Three
744 
745     if (argc == 1) {
746         int32_t instanceId = ContainerScope::CurrentId();
747         UIObserver::UnRegisterLayoutCallback(instanceId, nullptr);
748     }
749 
750     if (argc == 2 && MatchValueType(env, argv[1], napi_object)) { // 2: Param Size Two
751         napi_value context = argv[1];
752         if (context) {
753             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
754             UIObserver::UnRegisterLayoutCallback(uiContextInstanceId, nullptr);
755         }
756     }
757 
758     if (argc == 2 && MatchValueType(env, argv[1], napi_function)) { // 2: Param Size Two
759         int32_t instanceId = ContainerScope::CurrentId();
760         UIObserver::UnRegisterLayoutCallback(instanceId, argv[1]);
761     }
762 
763     if (argc == 3 && MatchValueType(env, argv[1], napi_object) && // 3: Param Size Three
764         MatchValueType(env, argv[2], napi_function)) { // 2: Param Index Two
765         napi_value context = argv[1];
766         if (context) {
767             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
768             UIObserver::UnRegisterLayoutCallback(uiContextInstanceId, argv[2]); // 2: Param Index Two
769         }
770     }
771 
772     napi_value result = nullptr;
773     return result;
774 }
775 
ProcessNavDestinationSwitchRegister(napi_env env,napi_callback_info info)776 napi_value ObserverProcess::ProcessNavDestinationSwitchRegister(napi_env env, napi_callback_info info)
777 {
778     NavDestinationSwitchParams params;
779     if (!ParseNavDestSwitchRegisterParams(env, info, params)) {
780         return nullptr;
781     }
782 
783     if (!isDestinationSwitchHandleFuncSetted_) {
784         NG::UIObserverHandler::GetInstance().SetHandleNavDestinationSwitchFunc(&UIObserver::HandleNavDestinationSwitch);
785         isDestinationSwitchHandleFuncSetted_ = true;
786     }
787 
788     auto listener = std::make_shared<UIObserverListener>(env, params.callback);
789     if (params.isUIContext) {
790         UIObserver::RegisterNavDestinationSwitchCallback(params.uiContextInstanceId, params.navigationId, listener);
791     } else {
792         UIObserver::RegisterNavDestinationSwitchCallback(env, params.abilityUIContext, params.navigationId, listener);
793     }
794 
795     return nullptr;
796 }
797 
ProcessNavDestinationSwitchUnRegister(napi_env env,napi_callback_info info)798 napi_value ObserverProcess::ProcessNavDestinationSwitchUnRegister(napi_env env, napi_callback_info info)
799 {
800     NavDestinationSwitchParams params;
801     if (!ParseNavDestSwitchUnRegisterParams(env, info, params)) {
802         return nullptr;
803     }
804 
805     if (params.isUIContext) {
806         UIObserver::UnRegisterNavDestinationSwitchCallback(
807             params.uiContextInstanceId, params.navigationId, params.callback);
808     } else {
809         UIObserver::UnRegisterNavDestinationSwitchCallback(
810             env, params.abilityUIContext, params.navigationId, params.callback);
811     }
812 
813     return nullptr;
814 }
815 
ProcessWillClickRegister(napi_env env,napi_callback_info info)816 napi_value ObserverProcess::ProcessWillClickRegister(napi_env env, napi_callback_info info)
817 {
818     GET_PARAMS(env, info, PARAM_SIZE_THREE);
819 
820     if (!isWillClickFuncSetted_) {
821         NG::UIObserverHandler::GetInstance().SetWillClickFunc(&UIObserver::HandleWillClick);
822         isWillClickFuncSetted_ = true;
823     }
824 
825     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
826         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
827         UIObserver::RegisterWillClickCallback(0, listener);
828     }
829 
830     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
831         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
832         auto context = argv[PARAM_INDEX_ONE];
833         if (context) {
834             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
835             if (IsUIAbilityContext(env, context)) {
836                 UIObserver::RegisterWillClickCallback(env, context, listener);
837             } else {
838                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
839                 UIObserver::RegisterWillClickCallback(uiContextInstanceId, listener);
840             }
841         }
842     }
843 
844     return nullptr;
845 }
846 
ProcessWillClickUnRegister(napi_env env,napi_callback_info info)847 napi_value ObserverProcess::ProcessWillClickUnRegister(napi_env env, napi_callback_info info)
848 {
849     GET_PARAMS(env, info, PARAM_SIZE_THREE);
850 
851     if (argc == PARAM_SIZE_ONE) {
852         UIObserver::UnRegisterWillClickCallback(0, nullptr);
853     }
854 
855     if (argc == PARAM_SIZE_TWO) {
856         if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
857             UIObserver::UnRegisterWillClickCallback(0, argv[PARAM_INDEX_ONE]);
858         } else if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
859             napi_value context = argv[PARAM_INDEX_ONE];
860             if (!context) {
861                 return nullptr;
862             }
863             if (IsUIAbilityContext(env, context)) {
864                 UIObserver::UnRegisterWillClickCallback(env, context, nullptr);
865             } else {
866                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
867                 UIObserver::UnRegisterWillClickCallback(uiContextInstanceId, nullptr);
868             }
869         }
870     }
871 
872     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
873         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
874         napi_value context = argv[PARAM_INDEX_ONE];
875         if (context) {
876             if (IsUIAbilityContext(env, context)) {
877                 UIObserver::UnRegisterWillClickCallback(env, context, argv[PARAM_INDEX_TWO]);
878             } else {
879                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
880                 UIObserver::UnRegisterWillClickCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
881             }
882         }
883     }
884 
885     return nullptr;
886 }
887 
ProcessDidClickRegister(napi_env env,napi_callback_info info)888 napi_value ObserverProcess::ProcessDidClickRegister(napi_env env, napi_callback_info info)
889 {
890     GET_PARAMS(env, info, PARAM_SIZE_THREE);
891 
892     if (!isDidClickFuncSetted_) {
893         NG::UIObserverHandler::GetInstance().SetDidClickFunc(&UIObserver::HandleDidClick);
894         isDidClickFuncSetted_ = true;
895     }
896 
897     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
898         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
899         UIObserver::RegisterDidClickCallback(0, listener);
900     }
901 
902     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
903         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
904         auto context = argv[PARAM_INDEX_ONE];
905         if (context) {
906             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
907             if (IsUIAbilityContext(env, context)) {
908                 UIObserver::RegisterDidClickCallback(env, context, listener);
909             } else {
910                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
911                 UIObserver::RegisterDidClickCallback(uiContextInstanceId, listener);
912             }
913         }
914     }
915 
916     return nullptr;
917 }
918 
ProcessDidClickUnRegister(napi_env env,napi_callback_info info)919 napi_value ObserverProcess::ProcessDidClickUnRegister(napi_env env, napi_callback_info info)
920 {
921     GET_PARAMS(env, info, PARAM_SIZE_THREE);
922 
923     if (argc == PARAM_SIZE_ONE) {
924         UIObserver::UnRegisterDidClickCallback(0, nullptr);
925     }
926 
927     if (argc == PARAM_SIZE_TWO) {
928         if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
929             UIObserver::UnRegisterDidClickCallback(0, argv[PARAM_INDEX_ONE]);
930         } else if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
931             napi_value context = argv[PARAM_INDEX_ONE];
932             if (!context) {
933                 return nullptr;
934             }
935             if (IsUIAbilityContext(env, context)) {
936                 UIObserver::UnRegisterDidClickCallback(env, context, nullptr);
937             } else {
938                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
939                 UIObserver::UnRegisterDidClickCallback(uiContextInstanceId, nullptr);
940             }
941         }
942     }
943 
944     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
945         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
946         napi_value context = argv[PARAM_INDEX_ONE];
947         if (context) {
948             if (IsUIAbilityContext(env, context)) {
949                 UIObserver::UnRegisterDidClickCallback(env, context, argv[PARAM_INDEX_TWO]);
950             } else {
951                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
952                 UIObserver::UnRegisterDidClickCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
953             }
954         }
955     }
956 
957     return nullptr;
958 }
959 
ProcessTabContentStateRegister(napi_env env,napi_callback_info info)960 napi_value ObserverProcess::ProcessTabContentStateRegister(napi_env env, napi_callback_info info)
961 {
962     GET_PARAMS(env, info, PARAM_SIZE_THREE);
963 
964     if (!isTabContentStateUpdateFuncSetted_) {
965         NG::UIObserverHandler::GetInstance().SetHandleTabContentStateUpdateFunc(
966             &UIObserver::HandleTabContentStateChange);
967         isTabContentStateUpdateFuncSetted_ = true;
968     }
969 
970     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
971         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
972         UIObserver::RegisterTabContentStateCallback(listener);
973     }
974 
975     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)
976         && MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
977         std::string id;
978         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
979             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
980             UIObserver::RegisterTabContentStateCallback(id, listener);
981         }
982     }
983 
984     napi_value result = nullptr;
985     return result;
986 }
987 
ProcessTabContentStateUnRegister(napi_env env,napi_callback_info info)988 napi_value ObserverProcess::ProcessTabContentStateUnRegister(napi_env env, napi_callback_info info)
989 {
990     GET_PARAMS(env, info, PARAM_SIZE_THREE);
991 
992     if (argc == PARAM_SIZE_ONE) {
993         UIObserver::UnRegisterTabContentStateCallback(nullptr);
994     }
995 
996     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
997         UIObserver::UnRegisterTabContentStateCallback(argv[PARAM_INDEX_ONE]);
998     }
999 
1000     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
1001         std::string id;
1002         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
1003             UIObserver::UnRegisterTabContentStateCallback(id, nullptr);
1004         }
1005     }
1006 
1007     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)
1008         && MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
1009         std::string id;
1010         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
1011             UIObserver::UnRegisterTabContentStateCallback(id, argv[PARAM_INDEX_TWO]);
1012         }
1013     }
1014 
1015     napi_value result = nullptr;
1016     return result;
1017 }
1018 
ProcessBeforePanStartRegister(napi_env env,napi_callback_info info)1019 napi_value ObserverProcess::ProcessBeforePanStartRegister(napi_env env, napi_callback_info info)
1020 {
1021     GET_PARAMS(env, info, PARAM_SIZE_THREE);
1022 
1023     if (!isPanGestureHandleFuncSetted_) {
1024         NG::UIObserverHandler::GetInstance().SetPanGestureHandleFunc(&UIObserver::HandlePanGestureAccept);
1025         isPanGestureHandleFuncSetted_ = true;
1026     }
1027 
1028     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
1029         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
1030         UIObserver::RegisterBeforePanStartCallback(0, listener);
1031     }
1032 
1033     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
1034         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
1035         auto context = argv[PARAM_INDEX_ONE];
1036         if (context) {
1037             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
1038             if (IsUIAbilityContext(env, context)) {
1039                 UIObserver::RegisterBeforePanStartCallback(env, context, listener);
1040             } else {
1041                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1042                 UIObserver::RegisterBeforePanStartCallback(uiContextInstanceId, listener);
1043             }
1044         }
1045     }
1046 
1047     return nullptr;
1048 }
1049 
ProcessBeforePanStartUnRegister(napi_env env,napi_callback_info info)1050 napi_value ObserverProcess::ProcessBeforePanStartUnRegister(napi_env env, napi_callback_info info)
1051 {
1052     GET_PARAMS(env, info, PARAM_SIZE_THREE);
1053 
1054     if (argc == PARAM_SIZE_ONE) {
1055         UIObserver::UnRegisterBeforePanStartCallback(0, nullptr);
1056     }
1057 
1058     if (argc == PARAM_SIZE_TWO) {
1059         if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
1060             UIObserver::UnRegisterBeforePanStartCallback(0, argv[PARAM_INDEX_ONE]);
1061         } else if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
1062             napi_value context = argv[PARAM_INDEX_ONE];
1063             if (!context) {
1064                 return nullptr;
1065             }
1066             if (IsUIAbilityContext(env, context)) {
1067                 UIObserver::UnRegisterBeforePanStartCallback(env, context, nullptr);
1068             } else {
1069                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1070                 UIObserver::UnRegisterBeforePanStartCallback(uiContextInstanceId, nullptr);
1071             }
1072         }
1073     }
1074 
1075     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
1076         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
1077         napi_value context = argv[PARAM_INDEX_ONE];
1078         if (context) {
1079             if (IsUIAbilityContext(env, context)) {
1080                 UIObserver::UnRegisterBeforePanStartCallback(env, context, argv[PARAM_INDEX_TWO]);
1081             } else {
1082                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1083                 UIObserver::UnRegisterBeforePanStartCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
1084             }
1085         }
1086     }
1087 
1088     return nullptr;
1089 }
1090 
ProcessBeforePanEndRegister(napi_env env,napi_callback_info info)1091 napi_value ObserverProcess::ProcessBeforePanEndRegister(napi_env env, napi_callback_info info)
1092 {
1093     GET_PARAMS(env, info, PARAM_SIZE_THREE);
1094 
1095     if (!isPanGestureHandleFuncSetted_) {
1096         NG::UIObserverHandler::GetInstance().SetPanGestureHandleFunc(&UIObserver::HandlePanGestureAccept);
1097         isPanGestureHandleFuncSetted_ = true;
1098     }
1099 
1100     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
1101         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
1102         UIObserver::RegisterBeforePanEndCallback(0, listener);
1103     }
1104 
1105     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
1106         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
1107         auto context = argv[PARAM_INDEX_ONE];
1108         if (context) {
1109             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
1110             if (IsUIAbilityContext(env, context)) {
1111                 UIObserver::RegisterBeforePanEndCallback(env, context, listener);
1112             } else {
1113                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1114                 UIObserver::RegisterBeforePanEndCallback(uiContextInstanceId, listener);
1115             }
1116         }
1117     }
1118 
1119     return nullptr;
1120 }
1121 
ProcessBeforePanEndUnRegister(napi_env env,napi_callback_info info)1122 napi_value ObserverProcess::ProcessBeforePanEndUnRegister(napi_env env, napi_callback_info info)
1123 {
1124     GET_PARAMS(env, info, PARAM_SIZE_THREE);
1125 
1126     if (argc == PARAM_SIZE_ONE) {
1127         UIObserver::UnRegisterBeforePanEndCallback(0, nullptr);
1128     }
1129 
1130     if (argc == PARAM_SIZE_TWO) {
1131         if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
1132             UIObserver::UnRegisterBeforePanEndCallback(0, argv[PARAM_INDEX_ONE]);
1133         } else if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
1134             napi_value context = argv[PARAM_INDEX_ONE];
1135             if (!context) {
1136                 return nullptr;
1137             }
1138             if (IsUIAbilityContext(env, context)) {
1139                 UIObserver::UnRegisterBeforePanEndCallback(env, context, nullptr);
1140             } else {
1141                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1142                 UIObserver::UnRegisterBeforePanEndCallback(uiContextInstanceId, nullptr);
1143             }
1144         }
1145     }
1146 
1147     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
1148         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
1149         napi_value context = argv[PARAM_INDEX_ONE];
1150         if (context) {
1151             if (IsUIAbilityContext(env, context)) {
1152                 UIObserver::UnRegisterBeforePanEndCallback(env, context, argv[PARAM_INDEX_TWO]);
1153             } else {
1154                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1155                 UIObserver::UnRegisterBeforePanEndCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
1156             }
1157         }
1158     }
1159 
1160     return nullptr;
1161 }
1162 
ProcessAfterPanStartRegister(napi_env env,napi_callback_info info)1163 napi_value ObserverProcess::ProcessAfterPanStartRegister(napi_env env, napi_callback_info info)
1164 {
1165     GET_PARAMS(env, info, PARAM_SIZE_THREE);
1166 
1167     if (!isPanGestureHandleFuncSetted_) {
1168         NG::UIObserverHandler::GetInstance().SetPanGestureHandleFunc(&UIObserver::HandlePanGestureAccept);
1169         isPanGestureHandleFuncSetted_ = true;
1170     }
1171 
1172     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
1173         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
1174         UIObserver::RegisterAfterPanStartCallback(0, listener);
1175     }
1176 
1177     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
1178         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
1179         auto context = argv[PARAM_INDEX_ONE];
1180         if (context) {
1181             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
1182             if (IsUIAbilityContext(env, context)) {
1183                 UIObserver::RegisterAfterPanStartCallback(env, context, listener);
1184             } else {
1185                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1186                 UIObserver::RegisterAfterPanStartCallback(uiContextInstanceId, listener);
1187             }
1188         }
1189     }
1190 
1191     return nullptr;
1192 }
1193 
ProcessAfterPanStartUnRegister(napi_env env,napi_callback_info info)1194 napi_value ObserverProcess::ProcessAfterPanStartUnRegister(napi_env env, napi_callback_info info)
1195 {
1196     GET_PARAMS(env, info, PARAM_SIZE_THREE);
1197 
1198     if (argc == PARAM_SIZE_ONE) {
1199         UIObserver::UnRegisterBeforePanStartCallback(0, nullptr);
1200     }
1201 
1202     if (argc == PARAM_SIZE_TWO) {
1203         if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
1204             UIObserver::UnRegisterAfterPanStartCallback(0, argv[PARAM_INDEX_ONE]);
1205         } else if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
1206             napi_value context = argv[PARAM_INDEX_ONE];
1207             if (!context) {
1208                 return nullptr;
1209             }
1210             if (IsUIAbilityContext(env, context)) {
1211                 UIObserver::UnRegisterAfterPanStartCallback(env, context, nullptr);
1212             } else {
1213                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1214                 UIObserver::UnRegisterAfterPanStartCallback(uiContextInstanceId, nullptr);
1215             }
1216         }
1217     }
1218 
1219     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
1220         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
1221         napi_value context = argv[PARAM_INDEX_ONE];
1222         if (context) {
1223             if (IsUIAbilityContext(env, context)) {
1224                 UIObserver::UnRegisterAfterPanStartCallback(env, context, argv[PARAM_INDEX_TWO]);
1225             } else {
1226                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1227                 UIObserver::UnRegisterAfterPanStartCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
1228             }
1229         }
1230     }
1231 
1232     return nullptr;
1233 }
1234 
ProcessAfterPanEndRegister(napi_env env,napi_callback_info info)1235 napi_value ObserverProcess::ProcessAfterPanEndRegister(napi_env env, napi_callback_info info)
1236 {
1237     GET_PARAMS(env, info, PARAM_SIZE_THREE);
1238 
1239     if (!isPanGestureHandleFuncSetted_) {
1240         NG::UIObserverHandler::GetInstance().SetPanGestureHandleFunc(&UIObserver::HandlePanGestureAccept);
1241         isPanGestureHandleFuncSetted_ = true;
1242     }
1243 
1244     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
1245         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
1246         UIObserver::RegisterAfterPanEndCallback(0, listener);
1247     }
1248 
1249     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
1250         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
1251         auto context = argv[PARAM_INDEX_ONE];
1252         if (context) {
1253             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
1254             if (IsUIAbilityContext(env, context)) {
1255                 UIObserver::RegisterAfterPanEndCallback(env, context, listener);
1256             } else {
1257                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1258                 UIObserver::RegisterAfterPanEndCallback(uiContextInstanceId, listener);
1259             }
1260         }
1261     }
1262 
1263     return nullptr;
1264 }
1265 
ProcessAfterPanEndUnRegister(napi_env env,napi_callback_info info)1266 napi_value ObserverProcess::ProcessAfterPanEndUnRegister(napi_env env, napi_callback_info info)
1267 {
1268     GET_PARAMS(env, info, PARAM_SIZE_THREE);
1269 
1270     if (argc == PARAM_SIZE_ONE) {
1271         UIObserver::UnRegisterAfterPanEndCallback(0, nullptr);
1272     }
1273 
1274     if (argc == PARAM_SIZE_TWO) {
1275         if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
1276             UIObserver::UnRegisterAfterPanEndCallback(0, argv[PARAM_INDEX_ONE]);
1277         } else if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
1278             napi_value context = argv[PARAM_INDEX_ONE];
1279             if (!context) {
1280                 return nullptr;
1281             }
1282             if (IsUIAbilityContext(env, context)) {
1283                 UIObserver::UnRegisterAfterPanEndCallback(env, context, nullptr);
1284             } else {
1285                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1286                 UIObserver::UnRegisterAfterPanEndCallback(uiContextInstanceId, nullptr);
1287             }
1288         }
1289     }
1290 
1291     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
1292         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
1293         napi_value context = argv[PARAM_INDEX_ONE];
1294         if (context) {
1295             if (IsUIAbilityContext(env, context)) {
1296                 UIObserver::UnRegisterAfterPanEndCallback(env, context, argv[PARAM_INDEX_TWO]);
1297             } else {
1298                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
1299                 UIObserver::UnRegisterAfterPanEndCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
1300             }
1301         }
1302     }
1303 
1304     return nullptr;
1305 }
1306 
ObserverOn(napi_env env,napi_callback_info info)1307 napi_value ObserverOn(napi_env env, napi_callback_info info)
1308 {
1309     return ObserverProcess::GetInstance().ProcessRegister(env, info);
1310 }
1311 
ObserverOff(napi_env env,napi_callback_info info)1312 napi_value ObserverOff(napi_env env, napi_callback_info info)
1313 {
1314     return ObserverProcess::GetInstance().ProcessUnRegister(env, info);
1315 }
1316 
AddToScrollEventType(napi_env env)1317 napi_value AddToScrollEventType(napi_env env)
1318 {
1319     napi_value scrollEventType = nullptr;
1320     napi_value prop = nullptr;
1321     napi_create_object(env, &scrollEventType);
1322     napi_create_uint32(env, SCROLL_START, &prop);
1323     napi_set_named_property(env, scrollEventType, "SCROLL_START", prop);
1324     napi_create_uint32(env, SCROLL_STOP, &prop);
1325     napi_set_named_property(env, scrollEventType, "SCROLL_STOP", prop);
1326     return scrollEventType;
1327 }
1328 
AddToRouterPageState(napi_env env)1329 napi_value AddToRouterPageState(napi_env env)
1330 {
1331     napi_value routerPageState = nullptr;
1332     napi_value prop = nullptr;
1333     napi_create_object(env, &routerPageState);
1334     napi_create_uint32(env, ABOUT_TO_APPEAR, &prop);
1335     napi_set_named_property(env, routerPageState, "ABOUT_TO_APPEAR", prop);
1336     napi_create_uint32(env, ABOUT_TO_DISAPPEAR, &prop);
1337     napi_set_named_property(env, routerPageState, "ABOUT_TO_DISAPPEAR", prop);
1338     napi_create_uint32(env, ON_PAGE_SHOW, &prop);
1339     napi_set_named_property(env, routerPageState, "ON_PAGE_SHOW", prop);
1340     napi_create_uint32(env, ON_PAGE_HIDE, &prop);
1341     napi_set_named_property(env, routerPageState, "ON_PAGE_HIDE", prop);
1342     napi_create_uint32(env, ON_BACK_PRESS, &prop);
1343     napi_set_named_property(env, routerPageState, "ON_BACK_PRESS", prop);
1344     return routerPageState;
1345 }
1346 
CreateNavDestinationState(napi_env env)1347 napi_value CreateNavDestinationState(napi_env env)
1348 {
1349     napi_value navDestinationState = nullptr;
1350     napi_create_object(env, &navDestinationState);
1351     napi_value prop = nullptr;
1352     napi_create_uint32(env, ON_SHOWN, &prop);
1353     napi_set_named_property(env, navDestinationState, "ON_SHOWN", prop);
1354     napi_create_uint32(env, ON_HIDDEN, &prop);
1355     napi_set_named_property(env, navDestinationState, "ON_HIDDEN", prop);
1356     napi_create_uint32(env, ON_APPEAR, &prop);
1357     napi_set_named_property(env, navDestinationState, "ON_APPEAR", prop);
1358     napi_create_uint32(env, ON_DISAPPEAR, &prop);
1359     napi_set_named_property(env, navDestinationState, "ON_DISAPPEAR", prop);
1360     napi_create_uint32(env, ON_WILL_SHOW, &prop);
1361     napi_set_named_property(env, navDestinationState, "ON_WILL_SHOW", prop);
1362     napi_create_uint32(env, ON_WILL_HIDE, &prop);
1363     napi_set_named_property(env, navDestinationState, "ON_WILL_HIDE", prop);
1364     napi_create_uint32(env, ON_WILL_APPEAR, &prop);
1365     napi_set_named_property(env, navDestinationState, "ON_WILL_APPEAR", prop);
1366     napi_create_uint32(env, ON_WILL_DISAPPEAR, &prop);
1367     napi_set_named_property(env, navDestinationState, "ON_WILL_DISAPPEAR", prop);
1368     napi_create_uint32(env, ON_BACKPRESS, &prop);
1369     napi_set_named_property(env, navDestinationState, "ON_BACKPRESS", prop);
1370     napi_create_uint32(env, ON_ACTIVE, &prop);
1371     napi_set_named_property(env, navDestinationState, "ON_ACTIVE", prop);
1372     napi_create_uint32(env, ON_INACTIVE, &prop);
1373     napi_set_named_property(env, navDestinationState, "ON_INACTIVE", prop);
1374     return navDestinationState;
1375 }
1376 
AddToTabContentState(napi_env env)1377 napi_value AddToTabContentState(napi_env env)
1378 {
1379     napi_value tabContentState = nullptr;
1380     napi_value prop = nullptr;
1381     napi_create_object(env, &tabContentState);
1382     napi_create_uint32(env, ON_SHOW, &prop);
1383     napi_set_named_property(env, tabContentState, "ON_SHOW", prop);
1384     napi_create_uint32(env, ON_HIDE, &prop);
1385     napi_set_named_property(env, tabContentState, "ON_HIDE", prop);
1386     return tabContentState;
1387 }
1388 
AddToGestureType(napi_env env)1389 napi_value AddToGestureType(napi_env env)
1390 {
1391     napi_value gestureType = nullptr;
1392     napi_value prop = nullptr;
1393     napi_create_object(env, &gestureType);
1394     napi_create_uint32(env, TAP_GESTURE, &prop);
1395     napi_set_named_property(env, gestureType, "TAP_GESTURE", prop);
1396     napi_create_uint32(env, LONG_PRESS_GESTURE, &prop);
1397     napi_set_named_property(env, gestureType, "LONG_PRESS_GESTURE", prop);
1398     napi_create_uint32(env, PAN_GESTURE, &prop);
1399     napi_set_named_property(env, gestureType, "PAN_GESTURE", prop);
1400     napi_create_uint32(env, PINCH_GESTURE, &prop);
1401     napi_set_named_property(env, gestureType, "PINCH_GESTURE", prop);
1402     napi_create_uint32(env, SWIPE_GESTURE, &prop);
1403     napi_set_named_property(env, gestureType, "SWIPE_GESTURE", prop);
1404     napi_create_uint32(env, ROTATION_GESTURE, &prop);
1405     napi_set_named_property(env, gestureType, "ROTATION_GESTURE", prop);
1406     napi_create_uint32(env, DRAG, &prop);
1407     napi_set_named_property(env, gestureType, "DRAG", prop);
1408     napi_create_uint32(env, CLICK, &prop);
1409     napi_set_named_property(env, gestureType, "CLICK", prop);
1410     return gestureType;
1411 }
1412 
AddToGestureRecognizerState(napi_env env)1413 napi_value AddToGestureRecognizerState(napi_env env)
1414 {
1415     napi_value gestureRecognizerState = nullptr;
1416     napi_value prop = nullptr;
1417     napi_create_object(env, &gestureRecognizerState);
1418     napi_create_uint32(env, READY, &prop);
1419     napi_set_named_property(env, gestureRecognizerState, "READY", prop);
1420     napi_create_uint32(env, DETECTING, &prop);
1421     napi_set_named_property(env, gestureRecognizerState, "DETECTING", prop);
1422     napi_create_uint32(env, PENDING, &prop);
1423     napi_set_named_property(env, gestureRecognizerState, "PENDING", prop);
1424     napi_create_uint32(env, BLOCKED, &prop);
1425     napi_set_named_property(env, gestureRecognizerState, "BLOCKED", prop);
1426     napi_create_uint32(env, SUCCESSFUL, &prop);
1427     napi_set_named_property(env, gestureRecognizerState, "SUCCESSFUL", prop);
1428     napi_create_uint32(env, FAILED, &prop);
1429     napi_set_named_property(env, gestureRecognizerState, "FAILED", prop);
1430     return gestureRecognizerState;
1431 }
1432 
UIObserverExport(napi_env env,napi_value exports)1433 static napi_value UIObserverExport(napi_env env, napi_value exports)
1434 {
1435     napi_value navDestinationState = CreateNavDestinationState(env);
1436 
1437     napi_value scrollEventType = nullptr;
1438     scrollEventType = AddToScrollEventType(env);
1439 
1440     napi_value routerPageState = nullptr;
1441     routerPageState = AddToRouterPageState(env);
1442 
1443     napi_value tabContentState = nullptr;
1444     tabContentState = AddToTabContentState(env);
1445 
1446     napi_value gestureType = nullptr;
1447     gestureType = AddToGestureType(env);
1448 
1449     napi_value gestureRecognizerState = nullptr;
1450     gestureRecognizerState = AddToGestureRecognizerState(env);
1451 
1452     napi_property_descriptor uiObserverDesc[] = {
1453         DECLARE_NAPI_FUNCTION("on", ObserverOn),
1454         DECLARE_NAPI_FUNCTION("off", ObserverOff),
1455         DECLARE_NAPI_PROPERTY("NavDestinationState", navDestinationState),
1456         DECLARE_NAPI_PROPERTY("ScrollEventType", scrollEventType),
1457         DECLARE_NAPI_PROPERTY("RouterPageState", routerPageState),
1458         DECLARE_NAPI_PROPERTY("TabContentState", tabContentState),
1459         DECLARE_NAPI_PROPERTY("GestureType", gestureType),
1460         DECLARE_NAPI_PROPERTY("GestureRecognizerState", gestureRecognizerState),
1461     };
1462     NAPI_CALL(
1463         env, napi_define_properties(env, exports, sizeof(uiObserverDesc) / sizeof(uiObserverDesc[0]), uiObserverDesc));
1464     return exports;
1465 }
1466 
1467 static napi_module uiObserverModule = {
1468     .nm_version = 1,
1469     .nm_flags = 0,
1470     .nm_filename = nullptr,
1471     .nm_register_func = UIObserverExport,
1472     .nm_modname = "arkui.observer",
1473     .nm_priv = ((void*)0),
1474     .reserved = { 0 },
1475 };
1476 
ObserverRegister()1477 extern "C" __attribute__((constructor)) void ObserverRegister()
1478 {
1479     napi_module_register(&uiObserverModule);
1480 }
1481 } // namespace OHOS::Ace::Napi
1482