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