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_BACKPRESS = 100;
51 
52 static constexpr uint32_t SCROLL_START = 0;
53 static constexpr uint32_t SCROLL_STOP = 1;
54 
55 static constexpr uint32_t ABOUT_TO_APPEAR = 0;
56 static constexpr uint32_t ABOUT_TO_DISAPPEAR = 1;
57 static constexpr uint32_t ON_PAGE_SHOW = 2;
58 static constexpr uint32_t ON_PAGE_HIDE = 3;
59 static constexpr uint32_t ON_BACK_PRESS = 4;
60 
61 static constexpr uint32_t ON_SHOW = 0;
62 static constexpr uint32_t ON_HIDE = 1;
63 
64 constexpr char NAVDESTINATION_UPDATE[] = "navDestinationUpdate";
65 constexpr char ROUTERPAGE_UPDATE[] = "routerPageUpdate";
66 constexpr char SCROLL_EVENT[] = "scrollEvent";
67 constexpr char DENSITY_UPDATE[] = "densityUpdate";
68 constexpr char LAYOUT_DONE[] = "didLayout";
69 constexpr char DRAW_COMMAND_SEND[] = "willDraw";
70 constexpr char NAVDESTINATION_SWITCH[] = "navDestinationSwitch";
71 constexpr char WILLCLICK_UPDATE[] = "willClick";
72 constexpr char DIDCLICK_UPDATE[] = "didClick";
73 constexpr char TAB_CONTENT_STATE[] = "tabContentUpdate";
74 
IsUIAbilityContext(napi_env env, napi_value context)75 bool IsUIAbilityContext(napi_env env, napi_value context)
76 {
77     napi_value abilityInfo = nullptr;
78     napi_get_named_property(env, context, "abilityInfo", &abilityInfo);
79     if (!abilityInfo) {
80         return false;
81     }
82     napi_value abilityInfoName = nullptr;
83     napi_get_named_property(env, abilityInfo, "name", &abilityInfoName);
84     if (abilityInfoName) {
85         return true;
86     }
87     return false;
88 }
89 
GetUIContextInstanceId(napi_env env, napi_value uiContext)90 int32_t GetUIContextInstanceId(napi_env env, napi_value uiContext)
91 {
92     int32_t result = 0;
93     if (IsUIAbilityContext(env, uiContext)) {
94         return result;
95     }
96     napi_value instanceId = nullptr;
97     napi_get_named_property(env, uiContext, "instanceId_", &instanceId);
98     napi_get_value_int32(env, instanceId, &result);
99     return result;
100 }
101 
MatchValueType(napi_env env, napi_value value, napi_valuetype targetType)102 bool MatchValueType(napi_env env, napi_value value, napi_valuetype targetType)
103 {
104     napi_valuetype valueType = napi_undefined;
105     napi_typeof(env, value, &valueType);
106     return valueType == targetType;
107 }
108 
ParseStringFromNapi(napi_env env, napi_value val, std::string& str)109 bool ParseStringFromNapi(napi_env env, napi_value val, std::string& str)
110 {
111     napi_valuetype type;
112     return GetNapiString(env, val, str, type);
113 }
114 
ParseNavigationId(napi_env env, napi_value obj, std::string& navigationStr)115 bool ParseNavigationId(napi_env env, napi_value obj, std::string& navigationStr)
116 {
117     napi_value navigationId = nullptr;
118     napi_get_named_property(env, obj, "navigationId", &navigationId);
119     return ParseStringFromNapi(env, navigationId, navigationStr);
120 }
121 
ParseScrollId(napi_env env, napi_value obj, std::string& result)122 bool ParseScrollId(napi_env env, napi_value obj, std::string& result)
123 {
124     napi_value resultId = nullptr;
125     napi_get_named_property(env, obj, "id", &resultId);
126     if (!MatchValueType(env, resultId, napi_string)) {
127         return false;
128     }
129     return ParseStringFromNapi(env, resultId, result);
130 }
131 
IsNavDestSwitchOptions(napi_env env, napi_value obj, std::string& navigationId)132 bool IsNavDestSwitchOptions(napi_env env, napi_value obj, std::string& navigationId)
133 {
134     if (!MatchValueType(env, obj, napi_object)) {
135         return false;
136     }
137     napi_value navId = nullptr;
138     napi_get_named_property(env, obj, "navigationId", &navId);
139     return ParseStringFromNapi(env, navId, navigationId);
140 }
141 
142 struct NavDestinationSwitchParams {
143     bool isUIContext = true;
144     std::optional<std::string> navigationId;
145     napi_value callback = nullptr;
146     napi_value abilityUIContext = nullptr;
147     int32_t uiContextInstanceId = 0;
148 };
149 
ParseNavDestSwitchRegisterParams(napi_env env, napi_callback_info info, NavDestinationSwitchParams& params)150 bool ParseNavDestSwitchRegisterParams(napi_env env, napi_callback_info info, NavDestinationSwitchParams& params)
151 {
152     GET_PARAMS(env, info, PARAM_SIZE_FOUR);
153 
154     auto& secondArg = argv[PARAM_INDEX_ONE];
155     auto& thirdArg = argv[PARAM_INDEX_TWO];
156     auto& fourthArg = argv[PARAM_INDEX_THREE];
157     std::string navigationId;
158     if (argc == PARAM_SIZE_TWO && MatchValueType(env, secondArg, napi_function)) {
159         // js code: UIObserver.on('navDestinationSwitch', callback)
160         params.callback = secondArg;
161     } else if (argc == PARAM_SIZE_THREE && MatchValueType(env, secondArg, napi_object) &&
162         MatchValueType(env, thirdArg, napi_function)) {
163         if (IsNavDestSwitchOptions(env, secondArg, navigationId)) {
164             // js code: UIObserver.on('navDestinationSwitch', { navigationId: navId }, callback)
165             params.navigationId = navigationId;
166         } else if (IsUIAbilityContext(env, secondArg)) {
167             // js code: observer.on('navDestinationSwitch', AbilityUIContext, callback)
168             params.isUIContext = false;
169             params.abilityUIContext = secondArg;
170         } else {
171             // js code: observer.on('navDestinationSwitch', UIContext, callback)
172             params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
173         }
174         params.callback = thirdArg;
175     } else if (argc == PARAM_SIZE_FOUR && MatchValueType(env, secondArg, napi_object) &&
176         IsNavDestSwitchOptions(env, thirdArg, navigationId) &&
177         MatchValueType(env, fourthArg, napi_function)) {
178         if (IsUIAbilityContext(env, secondArg)) {
179             // js code: observer.on('navDestinationSwitch', AbilityUIContext, { navigationId: navId }, callback)
180             params.isUIContext = false;
181             params.abilityUIContext = secondArg;
182         } else {
183             // js code: observer.on('navDestinationSwitch', UIContext, { navigationId: navId }, callback)
184             params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
185         }
186         params.navigationId = navigationId;
187         params.callback = fourthArg;
188     } else {
189         return false;
190     }
191 
192     return true;
193 }
194 
ParseNavDestSwitchUnRegisterParams( napi_env env, napi_value secondArg, NavDestinationSwitchParams& params)195 bool ParseNavDestSwitchUnRegisterParams(
196     napi_env env, napi_value secondArg, NavDestinationSwitchParams& params)
197 {
198     std::string navigationId;
199     if (MatchValueType(env, secondArg, napi_function)) {
200         // js code: UIObserver.off('navDestinationSwitch', callback)
201         params.callback = secondArg;
202     } else if (IsNavDestSwitchOptions(env, secondArg, navigationId)) {
203         // js code: UIObserver.off('navDestinationSwitch', { navigationId: navId })
204         params.navigationId = navigationId;
205     } else if (MatchValueType(env, secondArg, napi_object)) {
206         if (IsUIAbilityContext(env, secondArg)) {
207             // js code: observer.off('navDestinationSwitch', AbilityUIContext)
208             params.isUIContext = false;
209             params.abilityUIContext = secondArg;
210         } else {
211             // js code: observer.off('navDestinationSwitch', UIContext)
212             params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
213         }
214     } else {
215         return false;
216     }
217 
218     return true;
219 }
220 
ParseNavDestSwitchUnRegisterParams( napi_env env, napi_value secondArg, napi_value thirdArg, NavDestinationSwitchParams& params)221 bool ParseNavDestSwitchUnRegisterParams(
222     napi_env env, napi_value secondArg, napi_value thirdArg, NavDestinationSwitchParams& params)
223 {
224     std::string navigationId;
225     if (MatchValueType(env, thirdArg, napi_function)) {
226         params.callback = thirdArg;
227         if (IsNavDestSwitchOptions(env, secondArg, navigationId)) {
228             // js code: UIObserver.off('navDestinationSwitch', { navigationId: navId }, callback)
229             params.navigationId = navigationId;
230         } else if (MatchValueType(env, secondArg, napi_object)) {
231             if (IsUIAbilityContext(env, secondArg)) {
232                 // js code: observer.off('navDestinationSwitch', AbilityUIContext, callback)
233                 params.isUIContext = false;
234                 params.abilityUIContext = secondArg;
235             } else {
236                 // js code: observer.off('navDestinationSwitch', UIContext, callback)
237                 params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
238             }
239         } else {
240             return false;
241         }
242     } else if (MatchValueType(env, secondArg, napi_object) &&
243         IsNavDestSwitchOptions(env, thirdArg, navigationId)) {
244         if (IsUIAbilityContext(env, secondArg)) {
245             // js code: observer.off('navDestinationSwitch', AbilityUIContext, { navigationId: navId })
246             params.isUIContext = false;
247             params.abilityUIContext = secondArg;
248         } else {
249             // js code: observer.off('navDestinationSwitch', UIContext, { navigationId: navId })
250             params.uiContextInstanceId = GetUIContextInstanceId(env, secondArg);
251         }
252         params.navigationId = navigationId;
253     } else {
254         return false;
255     }
256 
257     return true;
258 }
259 
ParseNavDestSwitchUnRegisterParams( napi_env env, napi_value secondArg, napi_value thirdArg, napi_value fourthArg, NavDestinationSwitchParams& params)260 bool ParseNavDestSwitchUnRegisterParams(
261     napi_env env, napi_value secondArg, napi_value thirdArg,
262     napi_value fourthArg, NavDestinationSwitchParams& params)
263 {
264     std::string navigationId;
265     auto& context = secondArg;
266     auto& options = thirdArg;
267     auto& callback = fourthArg;
268     if (MatchValueType(env, context, napi_object) &&
269         IsNavDestSwitchOptions(env, options, navigationId) &&
270         MatchValueType(env, callback, napi_function)) {
271         if (IsUIAbilityContext(env, context)) {
272             // js code: observer.off('navDestinationSwitch', AbilityUIContext, { navigationId: navId }, callback)
273             params.isUIContext = false;
274             params.abilityUIContext = context;
275         } else {
276             // js code: observer.off('navDestinationSwitch', UIContext, { navigationId: navId }, callback)
277             params.uiContextInstanceId = GetUIContextInstanceId(env, context);
278         }
279         params.navigationId = navigationId;
280         params.callback = callback;
281         return true;
282     }
283 
284     return false;
285 }
286 
ParseNavDestSwitchUnRegisterParams( napi_env env, napi_callback_info info, NavDestinationSwitchParams& params)287 bool ParseNavDestSwitchUnRegisterParams(
288     napi_env env, napi_callback_info info, NavDestinationSwitchParams& params)
289 {
290     GET_PARAMS(env, info, PARAM_SIZE_FOUR);
291 
292     if (argc == PARAM_SIZE_TWO) {
293         return ParseNavDestSwitchUnRegisterParams(env, argv[PARAM_INDEX_ONE], params);
294     } else if (argc == PARAM_SIZE_THREE) {
295         return ParseNavDestSwitchUnRegisterParams(env, argv[PARAM_INDEX_ONE], argv[PARAM_INDEX_TWO], params);
296     } else if (argc == PARAM_SIZE_FOUR) {
297         return ParseNavDestSwitchUnRegisterParams(
298             env, argv[PARAM_INDEX_ONE], argv[PARAM_INDEX_TWO], argv[PARAM_INDEX_THREE], params);
299     } else if (argc != PARAM_SIZE_ONE) {
300         return false;
301     }
302 
303     return true;
304 }
305 } // namespace
306 
ObserverProcess()307 ObserverProcess::ObserverProcess()
308 {
309     registerProcessMap_ = {
310         { NAVDESTINATION_UPDATE, &ObserverProcess::ProcessNavigationRegister },
311         { SCROLL_EVENT, &ObserverProcess::ProcessScrollEventRegister },
312         { ROUTERPAGE_UPDATE, &ObserverProcess::ProcessRouterPageRegister },
313         { DENSITY_UPDATE, &ObserverProcess::ProcessDensityRegister },
314         { LAYOUT_DONE, &ObserverProcess::ProcessLayoutDoneRegister },
315         { DRAW_COMMAND_SEND, &ObserverProcess::ProcessDrawCommandSendRegister },
316         { NAVDESTINATION_SWITCH, &ObserverProcess::ProcessNavDestinationSwitchRegister },
317         { WILLCLICK_UPDATE, &ObserverProcess::ProcessWillClickRegister },
318         { DIDCLICK_UPDATE, &ObserverProcess::ProcessDidClickRegister },
319         { TAB_CONTENT_STATE, &ObserverProcess::ProcessTabContentStateRegister },
320     };
321     unregisterProcessMap_ = {
322         { NAVDESTINATION_UPDATE, &ObserverProcess::ProcessNavigationUnRegister },
323         { SCROLL_EVENT, &ObserverProcess::ProcessScrollEventUnRegister },
324         { ROUTERPAGE_UPDATE, &ObserverProcess::ProcessRouterPageUnRegister },
325         { DENSITY_UPDATE, &ObserverProcess::ProcessDensityUnRegister },
326         { LAYOUT_DONE, &ObserverProcess::ProcessLayoutDoneUnRegister },
327         { DRAW_COMMAND_SEND, &ObserverProcess::ProcessDrawCommandSendUnRegister},
328         { NAVDESTINATION_SWITCH, &ObserverProcess::ProcessNavDestinationSwitchUnRegister },
329         { WILLCLICK_UPDATE, &ObserverProcess::ProcessWillClickUnRegister },
330         { DIDCLICK_UPDATE, &ObserverProcess::ProcessDidClickUnRegister },
331         { TAB_CONTENT_STATE, &ObserverProcess::ProcessTabContentStateUnRegister },
332     };
333 }
334 
GetInstance()335 ObserverProcess& ObserverProcess::GetInstance()
336 {
337     static ObserverProcess instance;
338     return instance;
339 }
340 
ProcessRegister(napi_env env, napi_callback_info info)341 napi_value ObserverProcess::ProcessRegister(napi_env env, napi_callback_info info)
342 {
343     GET_PARAMS(env, info, PARAM_SIZE_THREE);
344     NAPI_ASSERT(env, (argc >= PARAM_SIZE_TWO && thisVar != nullptr), "Invalid arguments");
345     std::string type;
346     if (!ParseStringFromNapi(env, argv[PARAM_INDEX_ZERO], type)) {
347         return nullptr;
348     }
349     auto it = registerProcessMap_.find(type);
350     if (it == registerProcessMap_.end()) {
351         return nullptr;
352     }
353     return (this->*(it->second))(env, info);
354 }
355 
ProcessUnRegister(napi_env env, napi_callback_info info)356 napi_value ObserverProcess::ProcessUnRegister(napi_env env, napi_callback_info info)
357 {
358     GET_PARAMS(env, info, PARAM_SIZE_THREE);
359     NAPI_ASSERT(env, (argc >= PARAM_SIZE_ONE && thisVar != nullptr), "Invalid arguments");
360     std::string type;
361     if (!ParseStringFromNapi(env, argv[PARAM_INDEX_ZERO], type)) {
362         return nullptr;
363     }
364     auto it = unregisterProcessMap_.find(type);
365     if (it == unregisterProcessMap_.end()) {
366         return nullptr;
367     }
368     return (this->*(it->second))(env, info);
369 }
370 
ProcessNavigationRegister(napi_env env, napi_callback_info info)371 napi_value ObserverProcess::ProcessNavigationRegister(napi_env env, napi_callback_info info)
372 {
373     GET_PARAMS(env, info, PARAM_SIZE_THREE);
374 
375     if (!isNavigationHandleFuncSetted_) {
376         NG::UIObserverHandler::GetInstance().SetHandleNavigationChangeFunc(&UIObserver::HandleNavigationStateChange);
377         isNavigationHandleFuncSetted_ = true;
378     }
379 
380     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
381         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
382         UIObserver::RegisterNavigationCallback(listener);
383     }
384 
385     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
386         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
387         std::string id;
388         if (ParseNavigationId(env, argv[PARAM_INDEX_ONE], id)) {
389             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
390             UIObserver::RegisterNavigationCallback(id, listener);
391         }
392     }
393 
394     napi_value result = nullptr;
395     return result;
396 }
397 
ProcessNavigationUnRegister(napi_env env, napi_callback_info info)398 napi_value ObserverProcess::ProcessNavigationUnRegister(napi_env env, napi_callback_info info)
399 {
400     GET_PARAMS(env, info, PARAM_SIZE_THREE);
401 
402     if (argc == PARAM_SIZE_ONE) {
403         UIObserver::UnRegisterNavigationCallback(nullptr);
404     }
405 
406     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
407         UIObserver::UnRegisterNavigationCallback(argv[PARAM_INDEX_ONE]);
408     }
409 
410     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
411         std::string id;
412         if (ParseNavigationId(env, argv[PARAM_INDEX_ONE], id)) {
413             UIObserver::UnRegisterNavigationCallback(id, nullptr);
414         }
415     }
416 
417     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
418         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
419         std::string id;
420         if (ParseNavigationId(env, argv[PARAM_INDEX_ONE], id)) {
421             UIObserver::UnRegisterNavigationCallback(id, argv[PARAM_INDEX_TWO]);
422         }
423     }
424 
425     napi_value result = nullptr;
426     return result;
427 }
428 
ProcessScrollEventRegister(napi_env env, napi_callback_info info)429 napi_value ObserverProcess::ProcessScrollEventRegister(napi_env env, napi_callback_info info)
430 {
431     GET_PARAMS(env, info, PARAM_SIZE_THREE);
432 
433     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
434         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
435         UIObserver::RegisterScrollEventCallback(listener);
436     }
437 
438     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)
439         && MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
440         std::string id;
441         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
442             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
443             UIObserver::RegisterScrollEventCallback(id, listener);
444         }
445     }
446 
447     napi_value result = nullptr;
448     return result;
449 }
450 
ProcessScrollEventUnRegister(napi_env env, napi_callback_info info)451 napi_value ObserverProcess::ProcessScrollEventUnRegister(napi_env env, napi_callback_info info)
452 {
453     GET_PARAMS(env, info, PARAM_SIZE_THREE);
454 
455     if (argc == PARAM_SIZE_ONE) {
456         UIObserver::UnRegisterScrollEventCallback(nullptr);
457     }
458 
459     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
460         UIObserver::UnRegisterScrollEventCallback(argv[PARAM_INDEX_ONE]);
461     }
462 
463     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
464         std::string id;
465         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
466             UIObserver::UnRegisterScrollEventCallback(id, nullptr);
467         }
468     }
469 
470     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)
471         && MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
472         std::string id;
473         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
474             UIObserver::UnRegisterScrollEventCallback(id, argv[PARAM_INDEX_TWO]);
475         }
476     }
477 
478     napi_value result = nullptr;
479     return result;
480 }
481 
ProcessRouterPageRegister(napi_env env, napi_callback_info info)482 napi_value ObserverProcess::ProcessRouterPageRegister(napi_env env, napi_callback_info info)
483 {
484     GET_PARAMS(env, info, PARAM_SIZE_THREE);
485 
486     if (!isRouterPageHandleFuncSetted_) {
487         NG::UIObserverHandler::GetInstance().SetHandleRouterPageChangeFunc(&UIObserver::HandleRouterPageStateChange);
488         isRouterPageHandleFuncSetted_ = true;
489     }
490 
491     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
492         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
493         UIObserver::RegisterRouterPageCallback(0, listener);
494     }
495 
496     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
497         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
498         auto context = argv[PARAM_INDEX_ONE];
499         if (context) {
500             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
501             if (IsUIAbilityContext(env, context)) {
502                 UIObserver::RegisterRouterPageCallback(env, context, listener);
503             } else {
504                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
505                 UIObserver::RegisterRouterPageCallback(uiContextInstanceId, listener);
506             }
507         }
508     }
509 
510     napi_value result = nullptr;
511     return result;
512 }
513 
ProcessRouterPageUnRegister(napi_env env, napi_callback_info info)514 napi_value ObserverProcess::ProcessRouterPageUnRegister(napi_env env, napi_callback_info info)
515 {
516     GET_PARAMS(env, info, PARAM_SIZE_THREE);
517 
518     if (argc == PARAM_SIZE_ONE) {
519         UIObserver::UnRegisterRouterPageCallback(0, nullptr);
520     }
521 
522     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
523         UIObserver::UnRegisterRouterPageCallback(0, argv[PARAM_INDEX_ONE]);
524     }
525 
526     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
527         napi_value context = argv[PARAM_INDEX_ONE];
528         if (context) {
529             if (IsUIAbilityContext(env, context)) {
530                 UIObserver::UnRegisterRouterPageCallback(env, context, nullptr);
531             } else {
532                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
533                 UIObserver::UnRegisterRouterPageCallback(uiContextInstanceId, nullptr);
534             }
535         }
536     }
537 
538     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
539         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
540         napi_value context = argv[PARAM_INDEX_ONE];
541         if (context) {
542             if (IsUIAbilityContext(env, context)) {
543                 UIObserver::UnRegisterRouterPageCallback(env, context, argv[PARAM_INDEX_TWO]);
544             } else {
545                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
546                 UIObserver::UnRegisterRouterPageCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
547             }
548         }
549     }
550 
551     napi_value result = nullptr;
552     return result;
553 }
554 
ProcessDensityRegister(napi_env env, napi_callback_info info)555 napi_value ObserverProcess::ProcessDensityRegister(napi_env env, napi_callback_info info)
556 {
557     GET_PARAMS(env, info, PARAM_SIZE_THREE);
558 
559     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
560         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
561         int32_t instanceId = ContainerScope::CurrentId();
562         UIObserver::RegisterDensityCallback(instanceId, listener);
563     }
564 
565     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
566         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
567         auto context = argv[PARAM_INDEX_ONE];
568         if (context) {
569             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
570             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
571             UIObserver::RegisterDensityCallback(uiContextInstanceId, listener);
572         }
573     }
574 
575     napi_value result = nullptr;
576     return result;
577 }
578 
ProcessDensityUnRegister(napi_env env, napi_callback_info info)579 napi_value ObserverProcess::ProcessDensityUnRegister(napi_env env, napi_callback_info info)
580 {
581     GET_PARAMS(env, info, PARAM_SIZE_THREE);
582 
583     if (argc == PARAM_SIZE_ONE) {
584         int32_t instanceId = ContainerScope::CurrentId();
585         UIObserver::UnRegisterDensityCallback(instanceId, nullptr);
586     }
587 
588     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
589         napi_value context = argv[PARAM_INDEX_ONE];
590         if (context) {
591             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
592             UIObserver::UnRegisterDensityCallback(uiContextInstanceId, nullptr);
593         }
594     }
595 
596     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
597         int32_t instanceId = ContainerScope::CurrentId();
598         UIObserver::UnRegisterDensityCallback(instanceId, argv[PARAM_INDEX_ONE]);
599     }
600 
601     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
602         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
603         napi_value context = argv[PARAM_INDEX_ONE];
604         if (context) {
605             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
606             UIObserver::UnRegisterDensityCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
607         }
608     }
609 
610     napi_value result = nullptr;
611     return result;
612 }
613 
ProcessDrawCommandSendRegister(napi_env env, napi_callback_info info)614 napi_value ObserverProcess::ProcessDrawCommandSendRegister(napi_env env, napi_callback_info info)
615 {
616     GET_PARAMS(env, info, 3); // 3: Param Size Three
617 
618     if (argc == 2 && MatchValueType(env, argv[1], napi_function)) { // 2: Param Size Two
619         auto listener = std::make_shared<UIObserverListener>(env, argv[1]);
620         int32_t instanceId = ContainerScope::CurrentId();
621         UIObserver::RegisterDrawCallback(instanceId, listener);
622     }
623     if (argc == 3 && MatchValueType(env, argv[1], napi_object) && // 3: Param Size Three
624         MatchValueType(env, argv[2], napi_function)) { // 2: Param Index Two
625         auto context = argv[1];
626         if (context) {
627             auto listener = std::make_shared<UIObserverListener>(env, argv[2]); // 2: Param Index Two
628             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
629             UIObserver::RegisterDrawCallback(uiContextInstanceId, listener);
630         }
631     }
632     napi_value result = nullptr;
633     return result;
634 }
635 
ProcessDrawCommandSendUnRegister(napi_env env, napi_callback_info info)636 napi_value ObserverProcess::ProcessDrawCommandSendUnRegister(napi_env env, napi_callback_info info)
637 {
638     GET_PARAMS(env, info, 3); // 3: Param Size Three
639 
640     if (argc == 1) {
641         int32_t instanceId = ContainerScope::CurrentId();
642         UIObserver::UnRegisterDrawCallback(instanceId, nullptr);
643     }
644 
645     if (argc == 2 && MatchValueType(env, argv[1], napi_object)) { // 2: Param Size Two
646         napi_value context = argv[1];
647         if (context) {
648             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
649             UIObserver::UnRegisterDrawCallback(uiContextInstanceId, nullptr);
650         }
651     }
652 
653     if (argc == 2 && MatchValueType(env, argv[1], napi_function)) { // 2: Param Size Two
654         int32_t instanceId = ContainerScope::CurrentId();
655         UIObserver::UnRegisterDrawCallback(instanceId, argv[1]);
656     }
657 
658     if (argc == 3 && MatchValueType(env, argv[1], napi_object) && // 3: Param Size Three
659         MatchValueType(env, argv[2], napi_function)) { // 2: Param Index Two
660         napi_value context = argv[1];
661         if (context) {
662             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
663             UIObserver::UnRegisterDrawCallback(uiContextInstanceId, argv[2]); // 2: Param Index Two
664         }
665     }
666 
667     napi_value result = nullptr;
668     return result;
669 }
670 
ProcessLayoutDoneRegister(napi_env env, napi_callback_info info)671 napi_value ObserverProcess::ProcessLayoutDoneRegister(napi_env env, napi_callback_info info)
672 {
673     GET_PARAMS(env, info, 3); // 3: Param Size Three
674 
675     if (argc == 2 && MatchValueType(env, argv[1], napi_function)) { // 2: Param Size Two
676         auto listener = std::make_shared<UIObserverListener>(env, argv[1]);
677         int32_t instanceId = ContainerScope::CurrentId();
678         UIObserver::RegisterLayoutCallback(instanceId, listener);
679     }
680     if (argc == 3 && MatchValueType(env, argv[1], napi_object) && // 3: Param Size Three
681         MatchValueType(env, argv[2], napi_function)) { // 2: Param Index Two
682         auto context = argv[1];
683         if (context) {
684             auto listener = std::make_shared<UIObserverListener>(env, argv[2]); // 2: Param Index Two
685             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
686             UIObserver::RegisterLayoutCallback(uiContextInstanceId, listener);
687         }
688     }
689     napi_value result = nullptr;
690     return result;
691 }
692 
ProcessLayoutDoneUnRegister(napi_env env, napi_callback_info info)693 napi_value ObserverProcess::ProcessLayoutDoneUnRegister(napi_env env, napi_callback_info info)
694 {
695     GET_PARAMS(env, info, 3); // 3: Param Size Three
696 
697     if (argc == 1) {
698         int32_t instanceId = ContainerScope::CurrentId();
699         UIObserver::UnRegisterLayoutCallback(instanceId, nullptr);
700     }
701 
702     if (argc == 2 && MatchValueType(env, argv[1], napi_object)) { // 2: Param Size Two
703         napi_value context = argv[1];
704         if (context) {
705             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
706             UIObserver::UnRegisterLayoutCallback(uiContextInstanceId, nullptr);
707         }
708     }
709 
710     if (argc == 2 && MatchValueType(env, argv[1], napi_function)) { // 2: Param Size Two
711         int32_t instanceId = ContainerScope::CurrentId();
712         UIObserver::UnRegisterLayoutCallback(instanceId, argv[1]);
713     }
714 
715     if (argc == 3 && MatchValueType(env, argv[1], napi_object) && // 3: Param Size Three
716         MatchValueType(env, argv[2], napi_function)) { // 2: Param Index Two
717         napi_value context = argv[1];
718         if (context) {
719             auto uiContextInstanceId = GetUIContextInstanceId(env, context);
720             UIObserver::UnRegisterLayoutCallback(uiContextInstanceId, argv[2]); // 2: Param Index Two
721         }
722     }
723 
724     napi_value result = nullptr;
725     return result;
726 }
727 
ProcessNavDestinationSwitchRegister(napi_env env, napi_callback_info info)728 napi_value ObserverProcess::ProcessNavDestinationSwitchRegister(napi_env env, napi_callback_info info)
729 {
730     NavDestinationSwitchParams params;
731     if (!ParseNavDestSwitchRegisterParams(env, info, params)) {
732         return nullptr;
733     }
734 
735     if (!isDestinationSwitchHandleFuncSetted_) {
736         NG::UIObserverHandler::GetInstance().SetHandleNavDestinationSwitchFunc(&UIObserver::HandleNavDestinationSwitch);
737         isDestinationSwitchHandleFuncSetted_ = true;
738     }
739 
740     auto listener = std::make_shared<UIObserverListener>(env, params.callback);
741     if (params.isUIContext) {
742         UIObserver::RegisterNavDestinationSwitchCallback(params.uiContextInstanceId, params.navigationId, listener);
743     } else {
744         UIObserver::RegisterNavDestinationSwitchCallback(env, params.abilityUIContext, params.navigationId, listener);
745     }
746 
747     return nullptr;
748 }
749 
ProcessNavDestinationSwitchUnRegister(napi_env env, napi_callback_info info)750 napi_value ObserverProcess::ProcessNavDestinationSwitchUnRegister(napi_env env, napi_callback_info info)
751 {
752     NavDestinationSwitchParams params;
753     if (!ParseNavDestSwitchUnRegisterParams(env, info, params)) {
754         return nullptr;
755     }
756 
757     if (params.isUIContext) {
758         UIObserver::UnRegisterNavDestinationSwitchCallback(
759             params.uiContextInstanceId, params.navigationId, params.callback);
760     } else {
761         UIObserver::UnRegisterNavDestinationSwitchCallback(
762             env, params.abilityUIContext, params.navigationId, params.callback);
763     }
764 
765     return nullptr;
766 }
767 
ProcessWillClickRegister(napi_env env, napi_callback_info info)768 napi_value ObserverProcess::ProcessWillClickRegister(napi_env env, napi_callback_info info)
769 {
770     GET_PARAMS(env, info, PARAM_SIZE_THREE);
771 
772     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
773         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
774         UIObserver::RegisterWillClickCallback(0, listener);
775     }
776 
777     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
778         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
779         auto context = argv[PARAM_INDEX_ONE];
780         if (context) {
781             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
782             if (IsUIAbilityContext(env, context)) {
783                 UIObserver::RegisterWillClickCallback(env, context, listener);
784             } else {
785                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
786                 UIObserver::RegisterWillClickCallback(uiContextInstanceId, listener);
787             }
788         }
789     }
790 
791     return nullptr;
792 }
793 
ProcessWillClickUnRegister(napi_env env, napi_callback_info info)794 napi_value ObserverProcess::ProcessWillClickUnRegister(napi_env env, napi_callback_info info)
795 {
796     GET_PARAMS(env, info, PARAM_SIZE_THREE);
797 
798     if (argc == PARAM_SIZE_ONE) {
799         UIObserver::UnRegisterWillClickCallback(0, nullptr);
800     }
801 
802     if (argc == PARAM_SIZE_TWO) {
803         if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
804             UIObserver::UnRegisterWillClickCallback(0, argv[PARAM_INDEX_ONE]);
805         } else if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
806             napi_value context = argv[PARAM_INDEX_ONE];
807             if (!context) {
808                 return nullptr;
809             }
810             if (IsUIAbilityContext(env, context)) {
811                 UIObserver::UnRegisterWillClickCallback(env, context, nullptr);
812             } else {
813                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
814                 UIObserver::UnRegisterWillClickCallback(uiContextInstanceId, nullptr);
815             }
816         }
817     }
818 
819     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
820         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
821         napi_value context = argv[PARAM_INDEX_ONE];
822         if (context) {
823             if (IsUIAbilityContext(env, context)) {
824                 UIObserver::UnRegisterWillClickCallback(env, context, argv[PARAM_INDEX_TWO]);
825             } else {
826                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
827                 UIObserver::UnRegisterWillClickCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
828             }
829         }
830     }
831 
832     return nullptr;
833 }
834 
ProcessDidClickRegister(napi_env env, napi_callback_info info)835 napi_value ObserverProcess::ProcessDidClickRegister(napi_env env, napi_callback_info info)
836 {
837     GET_PARAMS(env, info, PARAM_SIZE_THREE);
838 
839     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
840         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
841         UIObserver::RegisterDidClickCallback(0, listener);
842     }
843 
844     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
845         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
846         auto context = argv[PARAM_INDEX_ONE];
847         if (context) {
848             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
849             if (IsUIAbilityContext(env, context)) {
850                 UIObserver::RegisterDidClickCallback(env, context, listener);
851             } else {
852                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
853                 UIObserver::RegisterDidClickCallback(uiContextInstanceId, listener);
854             }
855         }
856     }
857 
858     return nullptr;
859 }
860 
ProcessDidClickUnRegister(napi_env env, napi_callback_info info)861 napi_value ObserverProcess::ProcessDidClickUnRegister(napi_env env, napi_callback_info info)
862 {
863     GET_PARAMS(env, info, PARAM_SIZE_THREE);
864 
865     if (argc == PARAM_SIZE_ONE) {
866         UIObserver::UnRegisterDidClickCallback(0, nullptr);
867     }
868 
869     if (argc == PARAM_SIZE_TWO) {
870         if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
871             UIObserver::UnRegisterDidClickCallback(0, argv[PARAM_INDEX_ONE]);
872         } else if (MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
873             napi_value context = argv[PARAM_INDEX_ONE];
874             if (!context) {
875                 return nullptr;
876             }
877             if (IsUIAbilityContext(env, context)) {
878                 UIObserver::UnRegisterDidClickCallback(env, context, nullptr);
879             } else {
880                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
881                 UIObserver::UnRegisterDidClickCallback(uiContextInstanceId, nullptr);
882             }
883         }
884     }
885 
886     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object) &&
887         MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
888         napi_value context = argv[PARAM_INDEX_ONE];
889         if (context) {
890             if (IsUIAbilityContext(env, context)) {
891                 UIObserver::UnRegisterDidClickCallback(env, context, argv[PARAM_INDEX_TWO]);
892             } else {
893                 auto uiContextInstanceId = GetUIContextInstanceId(env, context);
894                 UIObserver::UnRegisterDidClickCallback(uiContextInstanceId, argv[PARAM_INDEX_TWO]);
895             }
896         }
897     }
898 
899     return nullptr;
900 }
901 
ProcessTabContentStateRegister(napi_env env, napi_callback_info info)902 napi_value ObserverProcess::ProcessTabContentStateRegister(napi_env env, napi_callback_info info)
903 {
904     GET_PARAMS(env, info, PARAM_SIZE_THREE);
905 
906     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
907         auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_ONE]);
908         UIObserver::RegisterTabContentStateCallback(listener);
909     }
910 
911     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)
912         && MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
913         std::string id;
914         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
915             auto listener = std::make_shared<UIObserverListener>(env, argv[PARAM_INDEX_TWO]);
916             UIObserver::RegisterTabContentStateCallback(id, listener);
917         }
918     }
919 
920     napi_value result = nullptr;
921     return result;
922 }
923 
ProcessTabContentStateUnRegister(napi_env env, napi_callback_info info)924 napi_value ObserverProcess::ProcessTabContentStateUnRegister(napi_env env, napi_callback_info info)
925 {
926     GET_PARAMS(env, info, PARAM_SIZE_THREE);
927 
928     if (argc == PARAM_SIZE_ONE) {
929         UIObserver::UnRegisterTabContentStateCallback(nullptr);
930     }
931 
932     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_function)) {
933         UIObserver::UnRegisterTabContentStateCallback(argv[PARAM_INDEX_ONE]);
934     }
935 
936     if (argc == PARAM_SIZE_TWO && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)) {
937         std::string id;
938         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
939             UIObserver::UnRegisterTabContentStateCallback(id, nullptr);
940         }
941     }
942 
943     if (argc == PARAM_SIZE_THREE && MatchValueType(env, argv[PARAM_INDEX_ONE], napi_object)
944         && MatchValueType(env, argv[PARAM_INDEX_TWO], napi_function)) {
945         std::string id;
946         if (ParseScrollId(env, argv[PARAM_INDEX_ONE], id)) {
947             UIObserver::UnRegisterTabContentStateCallback(id, argv[PARAM_INDEX_TWO]);
948         }
949     }
950 
951     napi_value result = nullptr;
952     return result;
953 }
954 
ObserverOn(napi_env env, napi_callback_info info)955 napi_value ObserverOn(napi_env env, napi_callback_info info)
956 {
957     return ObserverProcess::GetInstance().ProcessRegister(env, info);
958 }
959 
ObserverOff(napi_env env, napi_callback_info info)960 napi_value ObserverOff(napi_env env, napi_callback_info info)
961 {
962     return ObserverProcess::GetInstance().ProcessUnRegister(env, info);
963 }
964 
AddToScrollEventType(napi_env env)965 napi_value AddToScrollEventType(napi_env env)
966 {
967     napi_value scrollEventType = nullptr;
968     napi_value prop = nullptr;
969     napi_create_object(env, &scrollEventType);
970     napi_create_uint32(env, SCROLL_START, &prop);
971     napi_set_named_property(env, scrollEventType, "SCROLL_START", prop);
972     napi_create_uint32(env, SCROLL_STOP, &prop);
973     napi_set_named_property(env, scrollEventType, "SCROLL_STOP", prop);
974     return scrollEventType;
975 }
976 
AddToRouterPageState(napi_env env)977 napi_value AddToRouterPageState(napi_env env)
978 {
979     napi_value routerPageState = nullptr;
980     napi_value prop = nullptr;
981     napi_create_object(env, &routerPageState);
982     napi_create_uint32(env, ABOUT_TO_APPEAR, &prop);
983     napi_set_named_property(env, routerPageState, "ABOUT_TO_APPEAR", prop);
984     napi_create_uint32(env, ABOUT_TO_DISAPPEAR, &prop);
985     napi_set_named_property(env, routerPageState, "ABOUT_TO_DISAPPEAR", prop);
986     napi_create_uint32(env, ON_PAGE_SHOW, &prop);
987     napi_set_named_property(env, routerPageState, "ON_PAGE_SHOW", prop);
988     napi_create_uint32(env, ON_PAGE_HIDE, &prop);
989     napi_set_named_property(env, routerPageState, "ON_PAGE_HIDE", prop);
990     napi_create_uint32(env, ON_BACK_PRESS, &prop);
991     napi_set_named_property(env, routerPageState, "ON_BACK_PRESS", prop);
992     return routerPageState;
993 }
994 
CreateNavDestinationState(napi_env env)995 napi_value CreateNavDestinationState(napi_env env)
996 {
997     napi_value navDestinationState = nullptr;
998     napi_create_object(env, &navDestinationState);
999     napi_value prop = nullptr;
1000     napi_create_uint32(env, ON_SHOWN, &prop);
1001     napi_set_named_property(env, navDestinationState, "ON_SHOWN", prop);
1002     napi_create_uint32(env, ON_HIDDEN, &prop);
1003     napi_set_named_property(env, navDestinationState, "ON_HIDDEN", prop);
1004     napi_create_uint32(env, ON_APPEAR, &prop);
1005     napi_set_named_property(env, navDestinationState, "ON_APPEAR", prop);
1006     napi_create_uint32(env, ON_DISAPPEAR, &prop);
1007     napi_set_named_property(env, navDestinationState, "ON_DISAPPEAR", prop);
1008     napi_create_uint32(env, ON_WILL_SHOW, &prop);
1009     napi_set_named_property(env, navDestinationState, "ON_WILL_SHOW", prop);
1010     napi_create_uint32(env, ON_WILL_HIDE, &prop);
1011     napi_set_named_property(env, navDestinationState, "ON_WILL_HIDE", prop);
1012     napi_create_uint32(env, ON_WILL_APPEAR, &prop);
1013     napi_set_named_property(env, navDestinationState, "ON_WILL_APPEAR", prop);
1014     napi_create_uint32(env, ON_WILL_DISAPPEAR, &prop);
1015     napi_set_named_property(env, navDestinationState, "ON_WILL_DISAPPEAR", prop);
1016     napi_create_uint32(env, ON_BACKPRESS, &prop);
1017     napi_set_named_property(env, navDestinationState, "ON_BACKPRESS", prop);
1018     return navDestinationState;
1019 }
1020 
AddToTabContentState(napi_env env)1021 napi_value AddToTabContentState(napi_env env)
1022 {
1023     napi_value tabContentState = nullptr;
1024     napi_value prop = nullptr;
1025     napi_create_object(env, &tabContentState);
1026     napi_create_uint32(env, ON_SHOW, &prop);
1027     napi_set_named_property(env, tabContentState, "ON_SHOW", prop);
1028     napi_create_uint32(env, ON_HIDE, &prop);
1029     napi_set_named_property(env, tabContentState, "ON_HIDE", prop);
1030     return tabContentState;
1031 }
1032 
UIObserverExport(napi_env env, napi_value exports)1033 static napi_value UIObserverExport(napi_env env, napi_value exports)
1034 {
1035     NG::UIObserverHandler::GetInstance().SetHandleScrollEventChangeFunc(&UIObserver::HandleScrollEventStateChange);
1036     NG::UIObserverHandler::GetInstance().SetHandleDensityChangeFunc(&UIObserver::HandleDensityChange);
1037     NG::UIObserverHandler::GetInstance().SetLayoutDoneHandleFunc(&UIObserver::HandLayoutDoneChange);
1038     NG::UIObserverHandler::GetInstance().SetDrawCommandSendHandleFunc(&UIObserver::HandDrawCommandSendChange);
1039     NG::UIObserverHandler::GetInstance().SetWillClickFunc(&UIObserver::HandleWillClick);
1040     NG::UIObserverHandler::GetInstance().SetDidClickFunc(&UIObserver::HandleDidClick);
1041     NG::UIObserverHandler::GetInstance().SetHandleTabContentStateUpdateFunc(&UIObserver::HandleTabContentStateChange);
1042     napi_value navDestinationState = CreateNavDestinationState(env);
1043 
1044     napi_value scrollEventType = nullptr;
1045     scrollEventType = AddToScrollEventType(env);
1046 
1047     napi_value routerPageState = nullptr;
1048     routerPageState = AddToRouterPageState(env);
1049 
1050     napi_value tabContentState = nullptr;
1051     tabContentState = AddToTabContentState(env);
1052 
1053     napi_property_descriptor uiObserverDesc[] = {
1054         DECLARE_NAPI_FUNCTION("on", ObserverOn),
1055         DECLARE_NAPI_FUNCTION("off", ObserverOff),
1056         DECLARE_NAPI_PROPERTY("NavDestinationState", navDestinationState),
1057         DECLARE_NAPI_PROPERTY("ScrollEventType", scrollEventType),
1058         DECLARE_NAPI_PROPERTY("RouterPageState", routerPageState),
1059         DECLARE_NAPI_PROPERTY("TabContentState", tabContentState),
1060     };
1061     NAPI_CALL(
1062         env, napi_define_properties(env, exports, sizeof(uiObserverDesc) / sizeof(uiObserverDesc[0]), uiObserverDesc));
1063     return exports;
1064 }
1065 
1066 static napi_module uiObserverModule = {
1067     .nm_version = 1,
1068     .nm_flags = 0,
1069     .nm_filename = nullptr,
1070     .nm_register_func = UIObserverExport,
1071     .nm_modname = "arkui.observer",
1072     .nm_priv = ((void*)0),
1073     .reserved = { 0 },
1074 };
1075 
ObserverRegister()1076 extern "C" __attribute__((constructor)) void ObserverRegister()
1077 {
1078     napi_module_register(&uiObserverModule);
1079 }
1080 } // namespace OHOS::Ace::Napi
1081