• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ui_observer_listener.h"
17 #include "js_native_api.h"
18 #include "core/event/ace_events.h"
19 #include "interfaces/napi/kits/observer/gesture/gesture_observer_listener.h"
20 
21 namespace OHOS::Ace::Napi {
22 namespace {
23 constexpr char NAV_BAR[] = "navBar";
24 constexpr char GET_MODIFIER_KEY_STATE[] = "getModifierKeyState";
25 constexpr int32_t PARAM_SIZE_ONE = 1;
26 constexpr int32_t PARAM_SIZE_TWO = 2;
27 constexpr int32_t PARAM_SIZE_THREE = 3;
28 constexpr int32_t PARAM_SIZE_SIX = 6;
29 
CheckKeysPressed(const std::vector<KeyCode> & pressedKeyCodes,std::vector<std::string> & checkKeyCodes)30 bool CheckKeysPressed(const std::vector<KeyCode>& pressedKeyCodes, std::vector<std::string>& checkKeyCodes)
31 {
32     auto hasKeyCode = [pressedKeyCodes](const KeyCode& keyCode) -> bool {
33         auto it = std::find(pressedKeyCodes.begin(), pressedKeyCodes.end(), keyCode);
34         return it != pressedKeyCodes.end();
35     };
36     for (auto& checkKeyCode : checkKeyCodes) {
37         if (checkKeyCode == "ctrl") {
38             if (!hasKeyCode(KeyCode::KEY_CTRL_LEFT) && !hasKeyCode(KeyCode::KEY_CTRL_RIGHT)) {
39                 return false;
40             }
41         } else if (checkKeyCode == "shift") {
42             if (!hasKeyCode(KeyCode::KEY_SHIFT_LEFT) && !hasKeyCode(KeyCode::KEY_SHIFT_RIGHT)) {
43                 return false;
44             }
45         } else if (checkKeyCode == "alt") {
46             if (!hasKeyCode(KeyCode::KEY_ALT_LEFT) && !hasKeyCode(KeyCode::KEY_ALT_RIGHT)) {
47                 return false;
48             }
49         } else if (checkKeyCode == "fn") {
50             if (!hasKeyCode(KeyCode::KEY_FN)) {
51                 return false;
52             }
53         } else {
54             return false;
55         }
56     }
57     return true;
58 }
59 
GetParamLen(napi_env env,napi_value param)60 size_t GetParamLen(napi_env env, napi_value param)
61 {
62     size_t buffSize = 0;
63     napi_status status = napi_get_value_string_utf8(env, param, nullptr, 0, &buffSize);
64     if (status != napi_ok || buffSize == 0) {
65         return 0;
66     }
67     return buffSize;
68 }
69 
CheckAndParseStr(napi_env env,napi_value arg,std::string & recv)70 bool CheckAndParseStr(napi_env env, napi_value arg, std::string& recv)
71 {
72     if (arg == nullptr) {
73         return false;
74     }
75 
76     napi_valuetype valueType = napi_undefined;
77     napi_typeof(env, arg, &valueType);
78     if (valueType != napi_string) {
79         return false;
80     }
81 
82     size_t msgLen = GetParamLen(env, arg) + 1;
83     std::unique_ptr<char[]> message = std::make_unique<char[]>(msgLen);
84     size_t ret = 0;
85     if (napi_get_value_string_utf8(env, arg, message.get(), msgLen, &ret) != napi_ok) {
86         return false;
87     }
88 
89     recv = message.get();
90     return true;
91 }
92 
GetBaseEventInfo(napi_env env,napi_callback_info info,size_t * argc=nullptr,napi_value * argv=nullptr)93 static GestureEvent* GetBaseEventInfo(
94     napi_env env, napi_callback_info info, size_t* argc = nullptr, napi_value* argv = nullptr)
95 {
96     napi_value thisVar = nullptr;
97     NAPI_CALL(env, napi_get_cb_info(env, info, argc, argv, &thisVar, nullptr));
98 
99     GestureEvent* baseEventInfo = nullptr;
100     napi_status status = napi_unwrap(env, thisVar, (void**)&baseEventInfo);
101     if (status != napi_ok) {
102         LOGE("Failed to unwrap native object");
103         return nullptr;
104     }
105     CHECK_NULL_RETURN(baseEventInfo, nullptr);
106     return baseEventInfo;
107 }
108 
GetModifierKeyState(napi_env env,napi_callback_info info)109 static napi_value GetModifierKeyState(napi_env env, napi_callback_info info)
110 {
111     napi_escapable_handle_scope scope = nullptr;
112     auto status = napi_open_escapable_handle_scope(env, &scope);
113     if (status != napi_ok) {
114         return nullptr;
115     }
116     size_t argc = PARAM_SIZE_ONE;
117     napi_value argv = nullptr;
118     GestureEvent* gestureEventInfo = GetBaseEventInfo(env, info, &argc, &argv);
119     if (!gestureEventInfo) {
120         napi_close_escapable_handle_scope(env, scope);
121         return nullptr;
122     }
123 
124     bool ret = false;
125     status = napi_is_array(env, argv, &ret);
126     if (status != napi_ok) {
127         napi_close_escapable_handle_scope(env, scope);
128         return nullptr;
129     }
130     auto pressedKeyCodes = gestureEventInfo->GetPressedKeyCodes();
131     bool checkRet = false;
132     uint32_t length = 0;
133     std::string checkedKeyCode;
134     std::vector<std::string> checkedKeyCodes;
135     std::vector<std::string> validKeyCodes = { "ctrl", "shift", "alt", "fn" };
136     napi_get_array_length(env, argv, &length);
137 
138     for (uint32_t i = 0; i < length; ++i) {
139         napi_value element = nullptr;
140         napi_get_element(env, argv, i, &element);
141         std::string errMsg;
142         if (CheckAndParseStr(env, element, checkedKeyCode)) {
143             auto it = std::find(validKeyCodes.begin(), validKeyCodes.end(), checkedKeyCode);
144             if (it != validKeyCodes.end()) {
145                 checkedKeyCodes.emplace_back(checkedKeyCode);
146             }
147         }
148     }
149     checkRet = CheckKeysPressed(pressedKeyCodes, checkedKeyCodes);
150     napi_value result = nullptr;
151     napi_get_boolean(env, checkRet, &result);
152     napi_value newResult = nullptr;
153     napi_escape_handle(env, scope, result, &newResult);
154     napi_close_escapable_handle_scope(env, scope);
155     return newResult;
156 }
157 }
158 
OnNavigationStateChange(const NG::NavDestinationInfo & info)159 void UIObserverListener::OnNavigationStateChange(const NG::NavDestinationInfo& info)
160 {
161     if (!env_ || !callback_) {
162         TAG_LOGW(AceLogTag::ACE_OBSERVER,
163             "Handle navDestination state change failed, runtime or callback function invalid!");
164         return;
165     }
166     napi_handle_scope scope = nullptr;
167     auto status = napi_open_handle_scope(env_, &scope);
168     if (status != napi_ok) {
169         return;
170     }
171     napi_value callback = nullptr;
172     napi_get_reference_value(env_, callback_, &callback);
173     napi_value argv[] = { CreateNavDestinationInfoObj(info) };
174     napi_call_function(env_, nullptr, callback, 1, argv, nullptr);
175     napi_close_handle_scope(env_, scope);
176 }
177 
OnScrollEventStateChange(const std::string & id,int32_t uniqueId,NG::ScrollEventType eventType,float offset,Ace::Axis axis)178 void UIObserverListener::OnScrollEventStateChange(
179     const std::string& id, int32_t uniqueId, NG::ScrollEventType eventType, float offset, Ace::Axis axis)
180 {
181     if (!env_ || !callback_) {
182         TAG_LOGW(AceLogTag::ACE_OBSERVER,
183             "Handle scrollEvent state change failed, runtime or callback function invalid!");
184         return;
185     }
186     napi_handle_scope scope = nullptr;
187     auto status = napi_open_handle_scope(env_, &scope);
188     if (status != napi_ok) {
189         return;
190     }
191     napi_value callback = nullptr;
192     napi_get_reference_value(env_, callback_, &callback);
193     napi_value objValue = nullptr;
194     napi_create_object(env_, &objValue);
195     napi_value scrollId = nullptr;
196     napi_value frameNodeId = nullptr;
197     napi_value scrollEventType = nullptr;
198     napi_value scrollOffset = nullptr;
199     napi_value scrollAxis = nullptr;
200     napi_create_string_utf8(env_, id.c_str(), id.length(), &scrollId);
201     napi_create_int32(env_, uniqueId, &frameNodeId);
202     napi_create_int32(env_, static_cast<int32_t>(eventType), &scrollEventType);
203     napi_create_double(env_, offset, &scrollOffset);
204     napi_create_int32(env_, static_cast<int32_t>(axis), &scrollAxis);
205     napi_set_named_property(env_, objValue, "id", scrollId);
206     napi_set_named_property(env_, objValue, "uniqueId", frameNodeId);
207     napi_set_named_property(env_, objValue, "scrollEvent", scrollEventType);
208     napi_set_named_property(env_, objValue, "offset", scrollOffset);
209     napi_set_named_property(env_, objValue, "axis", scrollAxis);
210     napi_value argv[] = { objValue };
211     napi_call_function(env_, nullptr, callback, 1, argv, nullptr);
212     napi_close_handle_scope(env_, scope);
213 }
214 
OnRouterPageStateChange(const NG::RouterPageInfoNG & pageInfo)215 void UIObserverListener::OnRouterPageStateChange(const NG::RouterPageInfoNG& pageInfo)
216 {
217     if (!env_ || !callback_) {
218         TAG_LOGW(AceLogTag::ACE_OBSERVER,
219             "Handle router page state change failed, runtime or callback function invalid!");
220         return;
221     }
222     napi_handle_scope scope = nullptr;
223     auto status = napi_open_handle_scope(env_, &scope);
224     if (status != napi_ok) {
225         return;
226     }
227     napi_value callback = nullptr;
228     napi_get_reference_value(env_, callback_, &callback);
229     napi_value objValue = nullptr;
230     napi_create_object(env_, &objValue);
231     napi_value napiCtx = pageInfo.context;
232     napi_value napiIndex = nullptr;
233     napi_value napiName = nullptr;
234     napi_value napiPath = nullptr;
235     napi_value napiState = nullptr;
236     napi_value napiPageId = nullptr;
237     napi_create_int32(env_, pageInfo.index, &napiIndex);
238     napi_create_string_utf8(env_, pageInfo.name.c_str(), pageInfo.name.length(), &napiName);
239     napi_create_string_utf8(env_, pageInfo.path.c_str(), pageInfo.path.length(), &napiPath);
240     napi_create_int32(env_, static_cast<int32_t>(pageInfo.state), &napiState);
241     napi_create_string_utf8(env_, pageInfo.pageId.c_str(), pageInfo.pageId.length(), &napiPageId);
242     napi_set_named_property(env_, objValue, "context", napiCtx);
243     napi_set_named_property(env_, objValue, "index", napiIndex);
244     napi_set_named_property(env_, objValue, "name", napiName);
245     napi_set_named_property(env_, objValue, "path", napiPath);
246     napi_set_named_property(env_, objValue, "state", napiState);
247     napi_set_named_property(env_, objValue, "pageId", napiPageId);
248     napi_value argv[] = { objValue };
249     napi_call_function(env_, nullptr, callback, 1, argv, nullptr);
250     napi_close_handle_scope(env_, scope);
251 }
252 
OnDensityChange(double density)253 void UIObserverListener::OnDensityChange(double density)
254 {
255     if (!env_ || !callback_) {
256         TAG_LOGW(AceLogTag::ACE_OBSERVER,
257             "Handle density change failed, runtime or callback function invalid!");
258         return;
259     }
260     napi_handle_scope scope = nullptr;
261     auto status = napi_open_handle_scope(env_, &scope);
262     if (status != napi_ok) {
263         return;
264     }
265     napi_value callback = nullptr;
266     napi_get_reference_value(env_, callback_, &callback);
267     napi_value objValue = nullptr;
268     napi_create_object(env_, &objValue);
269     napi_value napiDensity = nullptr;
270     napi_create_double(env_, density, &napiDensity);
271     napi_set_named_property(env_, objValue, "density", napiDensity);
272     napi_value argv[] = { objValue };
273     napi_call_function(env_, nullptr, callback, 1, argv, nullptr);
274     napi_close_handle_scope(env_, scope);
275 }
276 
OnNodeRenderStateChange(NG::FrameNode * frameNode,NG::NodeRenderState nodeRenderState)277 void UIObserverListener::OnNodeRenderStateChange(NG::FrameNode* frameNode, NG::NodeRenderState nodeRenderState)
278 {
279     if (!env_ || !callback_) {
280         TAG_LOGW(
281             AceLogTag::ACE_OBSERVER, "Handle nodeRender state change failed, runtime or callback function invalid!");
282         return;
283     }
284     napi_handle_scope scope = nullptr;
285     auto status = napi_open_handle_scope(env_, &scope);
286     if (status != napi_ok) {
287         return;
288     }
289     napi_value callback = nullptr;
290     napi_get_reference_value(env_, callback_, &callback);
291 
292     napi_value objValueNodeRenderState = nullptr;
293     napi_create_int32(env_, static_cast<int32_t>(nodeRenderState), &objValueNodeRenderState);
294 
295     if (frameNode) {
296         napi_value objValueFrameNode = nullptr;
297         napi_create_object(env_, &objValueFrameNode);
298         auto container = Container::Current();
299         if (!container) {
300             napi_close_handle_scope(env_, scope);
301             return;
302         }
303         auto frontEnd = container->GetFrontend();
304         if (!frontEnd) {
305             napi_close_handle_scope(env_, scope);
306             return;
307         }
308         objValueFrameNode = frontEnd->GetFrameNodeValueByNodeId(frameNode->GetId());
309         napi_value argv[] = { objValueNodeRenderState, objValueFrameNode };
310         napi_call_function(env_, nullptr, callback, PARAM_SIZE_TWO, argv, nullptr);
311     } else {
312         napi_value argv[] = { objValueNodeRenderState };
313         napi_call_function(env_, nullptr, callback, PARAM_SIZE_ONE, argv, nullptr);
314     }
315 
316     napi_close_handle_scope(env_, scope);
317 }
318 
OnDrawOrLayout()319 void UIObserverListener::OnDrawOrLayout()
320 {
321     if (!env_ || !callback_) {
322         TAG_LOGW(AceLogTag::ACE_OBSERVER, "Handle draw or layout failed, runtime or callback function invalid!");
323         return;
324     }
325     napi_handle_scope scope = nullptr;
326     auto status = napi_open_handle_scope(env_, &scope);
327     if (status != napi_ok) {
328         return;
329     }
330     napi_value callback = nullptr;
331     napi_get_reference_value(env_, callback_, &callback);
332     napi_value objValue = nullptr;
333     napi_create_object(env_, &objValue);
334     napi_value argv[] = { objValue };
335     napi_call_function(env_, nullptr, callback, 1, argv, nullptr);
336     napi_close_handle_scope(env_, scope);
337 }
338 
OnNavDestinationSwitch(const NG::NavDestinationSwitchInfo & switchInfo)339 void UIObserverListener::OnNavDestinationSwitch(const NG::NavDestinationSwitchInfo& switchInfo)
340 {
341     if (!env_ || !callback_) {
342         TAG_LOGW(AceLogTag::ACE_OBSERVER,
343             "Handle navDestination switch failed, runtime or callback function invalid!");
344         return;
345     }
346     napi_handle_scope scope = nullptr;
347     auto status = napi_open_handle_scope(env_, &scope);
348     if (status != napi_ok) {
349         return;
350     }
351     napi_value callback = nullptr;
352     napi_get_reference_value(env_, callback_, &callback);
353     napi_value argv[] = { CreateNavDestinationSwitchInfoObj(switchInfo) };
354     napi_call_function(env_, nullptr, callback, 1, argv, nullptr);
355     napi_close_handle_scope(env_, scope);
356 }
357 
CreateNavDestinationSwitchInfoObj(const NG::NavDestinationSwitchInfo & switchInfo)358 napi_value UIObserverListener::CreateNavDestinationSwitchInfoObj(const NG::NavDestinationSwitchInfo& switchInfo)
359 {
360     napi_value objValue = nullptr;
361     napi_create_object(env_, &objValue);
362     napi_value napiOperation = nullptr;
363     napi_value napiFrom = nullptr;
364     if (switchInfo.from.has_value()) {
365         napiFrom = CreateNavDestinationInfoObj(switchInfo.from.value());
366     } else {
367         napi_create_string_utf8(env_, NAV_BAR, NAPI_AUTO_LENGTH, &napiFrom);
368     }
369     napi_value napiTo = nullptr;
370     if (switchInfo.to.has_value()) {
371         napiTo = CreateNavDestinationInfoObj(switchInfo.to.value());
372     } else {
373         napi_create_string_utf8(env_, NAV_BAR, NAPI_AUTO_LENGTH, &napiTo);
374     }
375     napi_create_int32(env_, static_cast<int32_t>(switchInfo.operation), &napiOperation);
376     napi_set_named_property(env_, objValue, "context", switchInfo.context);
377     napi_set_named_property(env_, objValue, "from", napiFrom);
378     napi_set_named_property(env_, objValue, "to", napiTo);
379     napi_set_named_property(env_, objValue, "operation", napiOperation);
380     return objValue;
381 }
382 
OnWillClick(const GestureEvent & gestureEventInfo,const ClickInfo & clickInfo,const RefPtr<NG::FrameNode> frameNode)383 void UIObserverListener::OnWillClick(
384     const GestureEvent& gestureEventInfo, const ClickInfo& clickInfo, const RefPtr<NG::FrameNode> frameNode)
385 {
386     if (!env_ || !callback_) {
387         TAG_LOGW(AceLogTag::ACE_OBSERVER,
388             "Handle density change failed, runtime or callback function invalid!");
389         return;
390     }
391     napi_handle_scope scope = nullptr;
392     auto status = napi_open_handle_scope(env_, &scope);
393     if (status != napi_ok) {
394         return;
395     }
396 
397     napi_value callback = nullptr;
398     napi_get_reference_value(env_, callback_, &callback);
399 
400     napi_value objValueClickEvent = nullptr;
401     napi_create_object(env_, &objValueClickEvent);
402 
403     AddBaseEventInfo(objValueClickEvent, clickInfo);
404     AddGestureEventInfoOne(objValueClickEvent, gestureEventInfo);
405     AddGestureEventInfoTwo(objValueClickEvent, gestureEventInfo);
406     AddGestureEventInfoThree(objValueClickEvent, gestureEventInfo);
407     AddTapLocationInfo(objValueClickEvent, gestureEventInfo);
408     AddClickEventInfoOne(objValueClickEvent, clickInfo);
409     AddClickEventInfoTwo(objValueClickEvent, clickInfo);
410 
411     napi_value objValueFrameNode = nullptr;
412     napi_create_object(env_, &objValueFrameNode);
413     objValueFrameNode = GetFrameNodeObject(frameNode);
414 
415     napi_value argv[] = { objValueClickEvent, objValueFrameNode };
416     napi_call_function(env_, nullptr, callback, PARAM_SIZE_TWO, argv, nullptr);
417     napi_close_handle_scope(env_, scope);
418 }
419 
OnDidClick(const GestureEvent & gestureEventInfo,const ClickInfo & clickInfo,const RefPtr<NG::FrameNode> frameNode)420 void UIObserverListener::OnDidClick(
421     const GestureEvent& gestureEventInfo, const ClickInfo& clickInfo, const RefPtr<NG::FrameNode> frameNode)
422 {
423     if (!env_ || !callback_) {
424         TAG_LOGW(AceLogTag::ACE_OBSERVER,
425             "Handle density change failed, runtime or callback function invalid!");
426         return;
427     }
428     napi_handle_scope scope = nullptr;
429     auto status = napi_open_handle_scope(env_, &scope);
430     if (status != napi_ok) {
431         return;
432     }
433 
434     napi_value callback = nullptr;
435     napi_get_reference_value(env_, callback_, &callback);
436 
437     napi_value objValueClickEvent = nullptr;
438     napi_create_object(env_, &objValueClickEvent);
439 
440     AddBaseEventInfo(objValueClickEvent, clickInfo);
441     AddGestureEventInfoOne(objValueClickEvent, gestureEventInfo);
442     AddGestureEventInfoTwo(objValueClickEvent, gestureEventInfo);
443     AddGestureEventInfoThree(objValueClickEvent, gestureEventInfo);
444     AddTapLocationInfo(objValueClickEvent, gestureEventInfo);
445     AddClickEventInfoOne(objValueClickEvent, clickInfo);
446     AddClickEventInfoTwo(objValueClickEvent, clickInfo);
447 
448     napi_value objValueFrameNode = nullptr;
449     napi_create_object(env_, &objValueFrameNode);
450     objValueFrameNode = GetFrameNodeObject(frameNode);
451 
452     napi_value argv[] = { objValueClickEvent, objValueFrameNode };
453     napi_call_function(env_, nullptr, callback, PARAM_SIZE_TWO, argv, nullptr);
454     napi_close_handle_scope(env_, scope);
455 }
456 
OnPanGestureStateChange(const GestureEvent & gestureEventInfo,const RefPtr<NG::PanRecognizer> & current,const RefPtr<NG::FrameNode> frameNode)457 void UIObserverListener::OnPanGestureStateChange(const GestureEvent& gestureEventInfo,
458     const RefPtr<NG::PanRecognizer>& current, const RefPtr<NG::FrameNode> frameNode)
459 {
460     if (!env_ || !callback_) {
461         TAG_LOGW(AceLogTag::ACE_OBSERVER, "Handle pan gesture change failed, runtime or callback function invalid!");
462         return;
463     }
464     napi_handle_scope scope = nullptr;
465     auto status = napi_open_handle_scope(env_, &scope);
466     if (status != napi_ok) {
467         return;
468     }
469 
470     napi_value callback = nullptr;
471     napi_get_reference_value(env_, callback_, &callback);
472 
473     napi_value objValueGestureEvent = nullptr;
474     napi_create_object(env_, &objValueGestureEvent);
475     napi_value objValueGestureRecognizer = nullptr;
476     napi_create_object(env_, &objValueGestureRecognizer);
477 
478     AddBaseEventInfo(objValueGestureEvent, gestureEventInfo);
479     AddGestureEventInfoOne(objValueGestureEvent, gestureEventInfo);
480     AddGestureEventInfoTwo(objValueGestureEvent, gestureEventInfo);
481     AddGestureEventInfoThree(objValueGestureEvent, gestureEventInfo);
482     AddGestureEventInfoFour(objValueGestureEvent, gestureEventInfo);
483     AddTargetObject(objValueGestureEvent, gestureEventInfo);
484     GestureObserverListener::AddGestureRecognizerInfo(
485         env_, objValueGestureRecognizer, current, NG::GestureListenerType::PAN);
486 
487     napi_value objValueFrameNode = nullptr;
488     napi_create_object(env_, &objValueFrameNode);
489     objValueFrameNode = GetFrameNodeObject(frameNode);
490 
491     napi_value argv[] = { objValueGestureEvent, objValueGestureRecognizer, objValueFrameNode };
492     napi_call_function(env_, nullptr, callback, PARAM_SIZE_THREE, argv, nullptr);
493     napi_close_handle_scope(env_, scope);
494 }
495 
OnGestureStateChange(NG::GestureListenerType gestureListenerType,const GestureEvent & gestureEventInfo,const RefPtr<NG::NGGestureRecognizer> & current,const RefPtr<NG::FrameNode> frameNode,NG::GestureActionPhase phase)496 void UIObserverListener::OnGestureStateChange(NG::GestureListenerType gestureListenerType,
497     const GestureEvent& gestureEventInfo, const RefPtr<NG::NGGestureRecognizer>& current,
498     const RefPtr<NG::FrameNode> frameNode, NG::GestureActionPhase phase)
499 {
500     if (!env_ || !callback_ || !current) {
501         TAG_LOGW(
502             AceLogTag::ACE_OBSERVER, "Handle gesture change failed, runtime, recognizer or callback function invalid!");
503         return;
504     }
505     napi_handle_scope scope = nullptr;
506     auto status = napi_open_handle_scope(env_, &scope);
507     if (status != napi_ok) {
508         return;
509     }
510 
511     napi_value callback = nullptr;
512     napi_get_reference_value(env_, callback_, &callback);
513 
514     napi_value objValueGestureTriggerInfo = nullptr;
515     napi_create_object(env_, &objValueGestureTriggerInfo);
516     napi_value objValueGestureEvent = nullptr;
517     napi_create_object(env_, &objValueGestureEvent);
518     napi_value objValueGestureRecognizer = nullptr;
519     napi_create_object(env_, &objValueGestureRecognizer);
520 
521     AddBaseEventInfo(objValueGestureEvent, gestureEventInfo);
522     AddGestureEventInfoOne(objValueGestureEvent, gestureEventInfo);
523     AddGestureEventInfoTwo(objValueGestureEvent, gestureEventInfo);
524     AddGestureEventInfoThree(objValueGestureEvent, gestureEventInfo);
525     bool canGetTap = gestureEventInfo.GetGestureTypeName() == GestureTypeName::TAP_GESTURE ||
526                      gestureEventInfo.GetGestureTypeName() == GestureTypeName::CLICK;
527     if (canGetTap) {
528         AddTapLocationInfo(objValueGestureEvent, gestureEventInfo);
529     }
530     AddGestureEventInfoFour(objValueGestureEvent, gestureEventInfo);
531     AddTargetObject(objValueGestureEvent, gestureEventInfo);
532     GestureObserverListener::AddGestureRecognizerInfo(env_, objValueGestureRecognizer, current, gestureListenerType);
533     napi_value currentPhase = nullptr;
534     napi_create_double(env_, static_cast<int32_t>(phase), &currentPhase);
535     napi_set_named_property(env_, objValueGestureTriggerInfo, "currentPhase", currentPhase);
536     napi_set_named_property(env_, objValueGestureTriggerInfo, "event", objValueGestureEvent);
537     napi_set_named_property(env_, objValueGestureTriggerInfo, "current", objValueGestureRecognizer);
538     napi_value objValueFrameNode = GetFrameNodeObject(frameNode);
539     if (objValueFrameNode) {
540         napi_set_named_property(env_, objValueGestureTriggerInfo, "node", objValueFrameNode);
541     }
542     napi_value argv[] = { objValueGestureTriggerInfo };
543     napi_call_function(env_, nullptr, callback, PARAM_SIZE_ONE, argv, nullptr);
544     napi_close_handle_scope(env_, scope);
545 }
546 
OnTabContentStateChange(const NG::TabContentInfo & tabContentInfo)547 void UIObserverListener::OnTabContentStateChange(const NG::TabContentInfo& tabContentInfo)
548 {
549     if (!env_ || !callback_) {
550         TAG_LOGW(AceLogTag::ACE_OBSERVER,
551             "Handle tabContent state change failed, runtime or callback function invalid!");
552         return;
553     }
554     napi_handle_scope scope = nullptr;
555     auto status = napi_open_handle_scope(env_, &scope);
556     if (status != napi_ok) {
557         return;
558     }
559     napi_value callback = nullptr;
560     napi_get_reference_value(env_, callback_, &callback);
561     napi_value objValue = nullptr;
562     napi_value param1 = nullptr;
563     napi_value param2 = nullptr;
564     napi_value param3 = nullptr;
565     napi_value param4 = nullptr;
566     napi_value param5 = nullptr;
567     napi_value param6 = nullptr;
568     napi_create_string_utf8(env_, tabContentInfo.tabContentId.c_str(), tabContentInfo.tabContentId.length(), &param1);
569     napi_create_int32(env_, tabContentInfo.tabContentUniqueId, &param2);
570     napi_create_int32(env_, static_cast<int32_t>(tabContentInfo.state), &param3);
571     napi_create_int32(env_, tabContentInfo.index, &param4);
572     napi_create_string_utf8(env_, tabContentInfo.id.c_str(), tabContentInfo.id.length(), &param5);
573     napi_create_int32(env_, tabContentInfo.uniqueId, &param6);
574     const char *keys[] = {
575         "tabContentId",
576         "tabContentUniqueId",
577         "state",
578         "index",
579         "id",
580         "uniqueId",
581     };
582     const napi_value values[] = {
583         param1,
584         param2,
585         param3,
586         param4,
587         param5,
588         param6,
589     };
590     napi_create_object_with_named_properties(env_, &objValue, PARAM_SIZE_SIX, keys, values);
591     napi_value argv[] = { objValue };
592     napi_call_function(env_, nullptr, callback, 1, argv, nullptr);
593     napi_close_handle_scope(env_, scope);
594 }
595 
GetValueType(napi_env env,napi_value value)596 napi_valuetype UIObserverListener::GetValueType(napi_env env, napi_value value)
597 {
598     if (value == nullptr) {
599         return napi_undefined;
600     }
601 
602     napi_valuetype valueType = napi_undefined;
603     NAPI_CALL_BASE(env, napi_typeof(env, value, &valueType), napi_undefined);
604     return valueType;
605 }
606 
GetNamedProperty(napi_env env,napi_value object,const std::string & propertyName)607 napi_value UIObserverListener::GetNamedProperty(napi_env env, napi_value object, const std::string& propertyName)
608 {
609     if (GetValueType(env, object) != napi_object) {
610         napi_value undefined = nullptr;
611         NAPI_CALL(env, napi_get_undefined(env, &undefined));
612         return undefined;
613     }
614 
615     napi_value value = nullptr;
616     NAPI_CALL(env, napi_get_named_property(env, object, propertyName.c_str(), &value));
617     return value;
618 }
619 
AddBaseEventInfo(napi_value objValueEvent,const BaseEventInfo & baseEventInfo)620 void UIObserverListener::AddBaseEventInfo(napi_value objValueEvent, const BaseEventInfo& baseEventInfo)
621 {
622     napi_handle_scope scope = nullptr;
623     auto status = napi_open_handle_scope(env_, &scope);
624     if (status != napi_ok) {
625         return;
626     }
627 
628     napi_value napiTimeStamp = nullptr;
629     napi_value napiSource = nullptr;
630     napi_value napiPressure = nullptr;
631     napi_value napiTiltX = nullptr;
632     napi_value napiTiltY = nullptr;
633     napi_value napiRollAngle = nullptr;
634     napi_value napiSourceTool = nullptr;
635 
636     napi_create_double(env_,
637         static_cast<double>(baseEventInfo.GetTimeStamp().time_since_epoch().count()), &napiTimeStamp);
638     napi_create_double(env_, static_cast<int32_t>(baseEventInfo.GetSourceDevice()), &napiSource);
639     napi_create_double(env_, baseEventInfo.GetForce(), &napiPressure);
640     if (baseEventInfo.GetTiltX().has_value()) {
641         napi_create_double(env_, baseEventInfo.GetTiltX().value(), &napiTiltX);
642     }
643     if (baseEventInfo.GetTiltY().has_value()) {
644         napi_create_double(env_, baseEventInfo.GetTiltY().value(), &napiTiltY);
645     }
646     napi_create_double(env_, baseEventInfo.GetRollAngle().value_or(0.0f), &napiRollAngle);
647     napi_create_double(env_, static_cast<int32_t>(baseEventInfo.GetSourceTool()), &napiSourceTool);
648 
649     napi_set_named_property(env_, objValueEvent, "timestamp", napiTimeStamp);
650     napi_set_named_property(env_, objValueEvent, "source", napiSource);
651     napi_set_named_property(env_, objValueEvent, "pressure", napiPressure);
652     napi_set_named_property(env_, objValueEvent, "tiltX", napiTiltX);
653     napi_set_named_property(env_, objValueEvent, "tiltY", napiTiltY);
654     napi_set_named_property(env_, objValueEvent, "rollAngle", napiRollAngle);
655     napi_set_named_property(env_, objValueEvent, "sourceTool", napiSourceTool);
656 
657     napi_close_handle_scope(env_, scope);
658 }
659 
AddGestureEventInfoOne(napi_value objValueEvent,const GestureEvent & gestureEventInfo)660 void UIObserverListener::AddGestureEventInfoOne(napi_value objValueEvent, const GestureEvent& gestureEventInfo)
661 {
662     napi_handle_scope scope = nullptr;
663     auto status = napi_open_handle_scope(env_, &scope);
664     if (status != napi_ok) {
665         return;
666     }
667     double scale = Dimension(1.0, DimensionUnit::VP).ConvertToPx();
668     if (NearZero(scale)) {
669         scale = 1.0;
670     }
671     napi_value napiRepeat = GetNamedProperty(env_, objValueEvent, "repeat");
672     if (GetValueType(env_, napiRepeat) != napi_null) {
673         napi_get_boolean(env_, gestureEventInfo.GetRepeat(), &napiRepeat);
674         napi_set_named_property(env_, objValueEvent, "repeat", napiRepeat);
675     }
676     napi_value napiOffsetX = GetNamedProperty(env_, objValueEvent, "offsetX");
677     if (GetValueType(env_, napiOffsetX) != napi_null) {
678         napi_create_double(env_, gestureEventInfo.GetOffsetX() / scale, &napiOffsetX);
679         napi_set_named_property(env_, objValueEvent, "offsetX", napiOffsetX);
680     }
681     napi_value napiOffsetY = GetNamedProperty(env_, objValueEvent, "offsetY");
682     if (GetValueType(env_, napiOffsetY) != napi_null) {
683         napi_create_double(env_, gestureEventInfo.GetOffsetY() / scale, &napiOffsetY);
684         napi_set_named_property(env_, objValueEvent, "offsetY", napiOffsetY);
685     }
686     napi_value napiScale = GetNamedProperty(env_, objValueEvent, "scale");
687     if (GetValueType(env_, napiScale) != napi_null) {
688         napi_create_double(env_, gestureEventInfo.GetScale(), &napiScale);
689         napi_set_named_property(env_, objValueEvent, "scale", napiScale);
690     }
691     napi_value napiAngle = GetNamedProperty(env_, objValueEvent, "angle");
692     if (GetValueType(env_, napiAngle) != napi_null) {
693         napi_create_double(env_, gestureEventInfo.GetAngle(), &napiAngle);
694         napi_set_named_property(env_, objValueEvent, "angle", napiAngle);
695     }
696     napi_value napiSpeed = GetNamedProperty(env_, objValueEvent, "speed");
697     if (GetValueType(env_, napiSpeed) != napi_null) {
698         napi_create_double(env_, gestureEventInfo.GetSpeed(), &napiSpeed);
699         napi_set_named_property(env_, objValueEvent, "speed", napiSpeed);
700     }
701     napi_close_handle_scope(env_, scope);
702 }
703 
AddGestureEventInfoTwo(napi_value objValueEvent,const GestureEvent & gestureEventInfo)704 void UIObserverListener::AddGestureEventInfoTwo(napi_value objValueEvent, const GestureEvent& gestureEventInfo)
705 {
706     napi_handle_scope scope = nullptr;
707     auto status = napi_open_handle_scope(env_, &scope);
708     if (status != napi_ok) { return; }
709     double scale = Dimension(1.0, DimensionUnit::VP).ConvertToPx();
710     if (NearZero(scale)) {
711         scale = 1.0;
712     }
713     napi_value napiGlobalX = GetNamedProperty(env_, objValueEvent, "globalX");
714     if (GetValueType(env_, napiGlobalX) != napi_null) {
715         napi_create_double(env_, gestureEventInfo.GetGlobalLocation().GetX() / scale, &napiGlobalX);
716         napi_set_named_property(env_, objValueEvent, "globalX", napiGlobalX);
717     }
718     napi_value napiGlobalY = GetNamedProperty(env_, objValueEvent, "globalY");
719     if (GetValueType(env_, napiGlobalY) != napi_null) {
720         napi_create_double(env_, gestureEventInfo.GetGlobalLocation().GetY() / scale, &napiGlobalY);
721         napi_set_named_property(env_, objValueEvent, "globalY", napiGlobalY);
722     }
723     napi_value napiLocalX = GetNamedProperty(env_, objValueEvent, "localX");
724     if (GetValueType(env_, napiLocalX) != napi_null) {
725         napi_create_double(env_, gestureEventInfo.GetLocalLocation().GetX() / scale, &napiLocalX);
726         napi_set_named_property(env_, objValueEvent, "localX", napiLocalX);
727     }
728     napi_value napiLocalY = GetNamedProperty(env_, objValueEvent, "localY");
729     if (GetValueType(env_, napiLocalY) != napi_null) {
730         napi_create_double(env_, gestureEventInfo.GetLocalLocation().GetY() / scale, &napiLocalY);
731         napi_set_named_property(env_, objValueEvent, "localY", napiLocalY);
732     }
733     napi_value napiGlobalDisplayX = GetNamedProperty(env_, objValueEvent, "globalDisplayX");
734     if (GetValueType(env_, napiGlobalDisplayX) != napi_null) {
735         napi_create_double(env_, gestureEventInfo.GetGlobalDisplayLocation().GetX() / scale, &napiGlobalDisplayX);
736         napi_set_named_property(env_, objValueEvent, "globalDisplayX", napiGlobalDisplayX);
737     }
738     napi_value napiGlobalDisplayY = GetNamedProperty(env_, objValueEvent, "globalDisplayY");
739     if (GetValueType(env_, napiGlobalDisplayY) != napi_null) {
740         napi_create_double(env_, gestureEventInfo.GetGlobalDisplayLocation().GetY() / scale, &napiGlobalDisplayY);
741         napi_set_named_property(env_, objValueEvent, "globalDisplayY", napiGlobalDisplayY);
742     }
743     napi_value napiPinchCenterX = GetNamedProperty(env_, objValueEvent, "pinchCenterX");
744     if (GetValueType(env_, napiPinchCenterX) != napi_null) {
745         napi_create_double(env_, gestureEventInfo.GetPinchCenter().GetX() / scale, &napiPinchCenterX);
746         napi_set_named_property(env_, objValueEvent, "pinchCenterX", napiPinchCenterX);
747     }
748     napi_value napiPinchCenterY = GetNamedProperty(env_, objValueEvent, "pinchCenterY");
749     if (GetValueType(env_, napiPinchCenterY) != napi_null) {
750         napi_create_double(env_, gestureEventInfo.GetPinchCenter().GetY() / scale, &napiPinchCenterY);
751         napi_set_named_property(env_, objValueEvent, "pinchCenterY", napiPinchCenterY);
752     }
753     napi_close_handle_scope(env_, scope);
754 }
755 
AddGestureEventInfoThree(napi_value objValueEvent,const GestureEvent & gestureEventInfo)756 void UIObserverListener::AddGestureEventInfoThree(napi_value objValueEvent, const GestureEvent& gestureEventInfo)
757 {
758     napi_handle_scope scope = nullptr;
759     auto status = napi_open_handle_scope(env_, &scope);
760     if (status != napi_ok) {
761         return;
762     }
763     double scale = Dimension(1.0, DimensionUnit::VP).ConvertToPx();
764     if (NearZero(scale)) {
765         scale = 1.0;
766     }
767     napi_value napiVelocityX = GetNamedProperty(env_, objValueEvent, "velocityX");
768     if (GetValueType(env_, napiVelocityX) != napi_null) {
769         napi_create_double(env_, gestureEventInfo.GetVelocity().GetVelocityX() / scale, &napiVelocityX);
770         napi_set_named_property(env_, objValueEvent, "velocityX", napiVelocityX);
771     }
772     napi_value napiVelocityY = GetNamedProperty(env_, objValueEvent, "velocityY");
773     if (GetValueType(env_, napiVelocityY) != napi_null) {
774         napi_create_double(env_, gestureEventInfo.GetVelocity().GetVelocityY() / scale, &napiVelocityY);
775         napi_set_named_property(env_, objValueEvent, "velocityY", napiVelocityY);
776     }
777     napi_value napiVelocity = GetNamedProperty(env_, objValueEvent, "velocity");
778     if (GetValueType(env_, napiVelocity) != napi_null) {
779         napi_create_double(env_, gestureEventInfo.GetVelocity().GetVelocityValue() / scale, &napiVelocity);
780         napi_set_named_property(env_, objValueEvent, "velocity", napiVelocity);
781     }
782     napi_value napiAxisHorizontal = nullptr;
783     napi_value napiAxisVertical = nullptr;
784     napi_value napiDeviceId = nullptr;
785     napi_value napiTargetDisplayId = nullptr;
786     napi_create_double(env_, gestureEventInfo.GetHorizontalAxis(), &napiAxisHorizontal);
787     napi_set_named_property(env_, objValueEvent, "axisHorizontal", napiAxisHorizontal);
788     napi_create_double(env_, gestureEventInfo.GetVerticalAxis(), &napiAxisVertical);
789     napi_set_named_property(env_, objValueEvent, "axisVertical", napiAxisVertical);
790     napi_create_double(env_, gestureEventInfo.GetDeviceId(), &napiDeviceId);
791     napi_set_named_property(env_, objValueEvent, "deviceId", napiDeviceId);
792     napi_create_double(env_, gestureEventInfo.GetTargetDisplayId(), &napiTargetDisplayId);
793     napi_set_named_property(env_, objValueEvent, "targetDisplayId", napiTargetDisplayId);
794     AddFingerListInfo(objValueEvent, gestureEventInfo);
795     AddFingerInfosInfo(objValueEvent, gestureEventInfo);
796     napi_close_handle_scope(env_, scope);
797 }
798 
AddTapLocationInfo(napi_value objTapGestureEventInfo,const GestureEvent & gestureEventInfo)799 void UIObserverListener::AddTapLocationInfo(napi_value objTapGestureEventInfo, const GestureEvent& gestureEventInfo)
800 {
801     napi_handle_scope scope = nullptr;
802     auto status = napi_open_handle_scope(env_, &scope);
803     if (status != napi_ok) {
804         return;
805     }
806     if (gestureEventInfo.GetFingerList().size() == 0) {
807         napi_close_handle_scope(env_, scope);
808         return;
809     }
810 
811     double scale = Dimension(1.0, DimensionUnit::VP).ConvertToPx();
812     if (NearZero(scale)) {
813         scale = 1.0;
814     }
815 
816     auto fingerInfo = gestureEventInfo.GetFingerList().back();
817 
818     napi_value tapLocation = nullptr;
819     napi_create_object(env_, &tapLocation);
820 
821     const OHOS::Ace::Offset& globalLocation = fingerInfo.globalLocation_;
822     const OHOS::Ace::Offset& localLocation = fingerInfo.localLocation_;
823     const OHOS::Ace::Offset& screenLocation = fingerInfo.screenLocation_;
824     const OHOS::Ace::Offset& globalDisplayLocation = fingerInfo.globalDisplayLocation_;
825     napi_value napiGlobalX = nullptr;
826     napi_create_double(env_, globalLocation.GetX() / scale, &napiGlobalX);
827     napi_set_named_property(env_, tapLocation, "windowX", napiGlobalX);
828     napi_value napiGlobalY = nullptr;
829     napi_create_double(env_, globalLocation.GetY() / scale, &napiGlobalY);
830     napi_set_named_property(env_, tapLocation, "windowY", napiGlobalY);
831     napi_value napiLocalX = nullptr;
832     napi_create_double(env_, localLocation.GetX() / scale, &napiLocalX);
833     napi_set_named_property(env_, tapLocation, "x", napiLocalX);
834     napi_value napiLocalY = nullptr;
835     napi_create_double(env_, localLocation.GetY() / scale, &napiLocalY);
836     napi_set_named_property(env_, tapLocation, "y", napiLocalY);
837     napi_value napiScreenX = nullptr;
838     napi_create_double(env_, screenLocation.GetX() / scale, &napiScreenX);
839     napi_set_named_property(env_, tapLocation, "displayX", napiScreenX);
840     napi_value napiScreenY = nullptr;
841     napi_create_double(env_, screenLocation.GetY() / scale, &napiScreenY);
842     napi_set_named_property(env_, tapLocation, "displayY", napiScreenY);
843     napi_value napiGlobalDisplayX = nullptr;
844     napi_create_double(env_, globalDisplayLocation.GetX() / scale, &napiGlobalDisplayX);
845     napi_set_named_property(env_, tapLocation, "globalDisplayX", napiGlobalDisplayX);
846     napi_value napiGlobalDisplayY = nullptr;
847     napi_create_double(env_, globalDisplayLocation.GetY() / scale, &napiGlobalDisplayY);
848     napi_set_named_property(env_, tapLocation, "globalDisplayY", napiGlobalDisplayY);
849     napi_set_named_property(env_, objTapGestureEventInfo, "tapLocation", tapLocation);
850     napi_close_handle_scope(env_, scope);
851 }
852 
AddFingerListInfo(napi_value objValueClickEvent,const GestureEvent & gestureEventInfo)853 void UIObserverListener::AddFingerListInfo(napi_value objValueClickEvent, const GestureEvent& gestureEventInfo)
854 {
855     napi_handle_scope scope = nullptr;
856     auto status = napi_open_handle_scope(env_, &scope);
857     if (status != napi_ok) {
858         return;
859     }
860 
861     const std::list<FingerInfo>& fingerList = gestureEventInfo.GetFingerList();
862     napi_value napiFingerList = nullptr;
863     napi_create_array(env_, &napiFingerList);
864     bool isArray = false;
865     if (napi_is_array(env_, napiFingerList, &isArray) != napi_ok || !isArray) {
866         napi_close_handle_scope(env_, scope);
867         return;
868     }
869     if (fingerList.size() > 0) {
870         for (auto finger : fingerList) {
871             napi_value napiFinger = nullptr;
872             napi_create_object(env_, &napiFinger);
873             AddFingerObjectInfo(napiFinger, finger);
874             napi_set_element(env_, napiFingerList, finger.fingerId_, napiFinger);
875         }
876     }
877     napi_set_named_property(env_, objValueClickEvent, "fingerList", napiFingerList);
878     napi_close_handle_scope(env_, scope);
879 }
880 
AddFingerInfosInfo(napi_value objValueClickEvent,const GestureEvent & gestureEventInfo)881 void UIObserverListener::AddFingerInfosInfo(napi_value objValueClickEvent, const GestureEvent& gestureEventInfo)
882 {
883     napi_handle_scope scope = nullptr;
884     auto status = napi_open_handle_scope(env_, &scope);
885     if (status != napi_ok) {
886         return;
887     }
888 
889     napi_value napiFingerInfos = nullptr;
890     napi_create_array(env_, &napiFingerInfos);
891     bool isArray = false;
892     if (napi_is_array(env_, napiFingerInfos, &isArray) != napi_ok || !isArray) {
893         napi_close_handle_scope(env_, scope);
894         return;
895     }
896 
897     int32_t index = 0;
898 
899     for (auto& finger : gestureEventInfo.GetFingerList()) {
900         napi_value napiFinger = nullptr;
901         napi_create_object(env_, &napiFinger);
902         AddFingerObjectInfo(napiFinger, finger);
903         napi_set_element(env_, napiFingerInfos, index++, napiFinger);
904     }
905 
906     napi_set_named_property(env_, objValueClickEvent, "fingerInfos", napiFingerInfos);
907     napi_close_handle_scope(env_, scope);
908 }
909 
AddFingerObjectInfo(napi_value napiFinger,const FingerInfo & finger)910 void UIObserverListener::AddFingerObjectInfo(napi_value napiFinger, const FingerInfo& finger)
911 {
912     double scale = Dimension(1.0, DimensionUnit::VP).ConvertToPx();
913     if (NearZero(scale)) {
914         scale = 1.0;
915     }
916     napi_value napiId = nullptr;
917     napi_create_double(env_, finger.fingerId_, &napiId);
918     napi_set_named_property(env_, napiFinger, "id", napiId);
919     napi_value napiHand = nullptr;
920     napi_create_int32(env_, finger.operatingHand_, &napiHand);
921     napi_set_named_property(env_, napiFinger, "hand", napiHand);
922     const OHOS::Ace::Offset& globalLocation = finger.globalLocation_;
923     const OHOS::Ace::Offset& localLocation = finger.localLocation_;
924     const OHOS::Ace::Offset& screenLocaltion = finger.screenLocation_;
925     const OHOS::Ace::Offset& globalDisplayLocaltion = finger.globalDisplayLocation_;
926     napi_value napiGlobalX = nullptr;
927     napi_create_double(env_, globalLocation.GetX() / scale, &napiGlobalX);
928     napi_set_named_property(env_, napiFinger, "globalX", napiGlobalX);
929     napi_value napiGlobalY = nullptr;
930     napi_create_double(env_, globalLocation.GetY() / scale, &napiGlobalY);
931     napi_set_named_property(env_, napiFinger, "globalY", napiGlobalY);
932     napi_value napiLocalX = nullptr;
933     napi_create_double(env_, localLocation.GetX() / scale, &napiLocalX);
934     napi_set_named_property(env_, napiFinger, "localX", napiLocalX);
935     napi_value napiLocalY = nullptr;
936     napi_create_double(env_, localLocation.GetY() / scale, &napiLocalY);
937     napi_set_named_property(env_, napiFinger, "localY", napiLocalY);
938     napi_value napiDisplayX = nullptr;
939     napi_create_double(env_, screenLocaltion.GetX() / scale, &napiDisplayX);
940     napi_set_named_property(env_, napiFinger, "displayX", napiDisplayX);
941     napi_value napiDisplayY = nullptr;
942     napi_create_double(env_, screenLocaltion.GetY() / scale, &napiDisplayY);
943     napi_set_named_property(env_, napiFinger, "displayY", napiDisplayY);
944     napi_value napiGlobalDisplayX = nullptr;
945     napi_create_double(env_, globalDisplayLocaltion.GetX() / scale, &napiGlobalDisplayX);
946     napi_set_named_property(env_, napiFinger, "globalDisplayX", napiGlobalDisplayX);
947     napi_value napiGlobalDisplayY = nullptr;
948     napi_create_double(env_, globalDisplayLocaltion.GetY() / scale, &napiGlobalDisplayY);
949     napi_set_named_property(env_, napiFinger, "globalDisplayY", napiGlobalDisplayY);
950 }
951 
AddClickEventInfoOne(napi_value objValueClickEvent,const ClickInfo & clickInfo)952 void UIObserverListener::AddClickEventInfoOne(napi_value objValueClickEvent, const ClickInfo& clickInfo)
953 {
954     napi_handle_scope scope = nullptr;
955     auto status = napi_open_handle_scope(env_, &scope);
956     if (status != napi_ok) {
957         return;
958     }
959 
960     double scale = Dimension(1.0, DimensionUnit::VP).ConvertToPx();
961     if (NearZero(scale)) {
962         scale = 1.0;
963     }
964     Offset globalOffset = clickInfo.GetGlobalLocation();
965     Offset screenOffset = clickInfo.GetScreenLocation();
966     Offset globalDisplayOffset = clickInfo.GetGlobalDisplayLocation();
967     napi_value napiDisplayX = GetNamedProperty(env_, objValueClickEvent, "displayX");
968     if (GetValueType(env_, napiDisplayX) != napi_null) {
969         napi_create_double(env_, screenOffset.GetX() / scale, &napiDisplayX);
970         napi_set_named_property(env_, objValueClickEvent, "displayX", napiDisplayX);
971     }
972     napi_value napiDisplayY = GetNamedProperty(env_, objValueClickEvent, "displayY");
973     if (GetValueType(env_, napiDisplayY) != napi_null) {
974         napi_create_double(env_, screenOffset.GetY() / scale, &napiDisplayY);
975         napi_set_named_property(env_, objValueClickEvent, "displayY", napiDisplayY);
976     }
977     napi_value napiWindowX = GetNamedProperty(env_, objValueClickEvent, "windowX");
978     if (GetValueType(env_, napiWindowX) != napi_null) {
979         napi_create_double(env_, globalOffset.GetX() / scale, &napiWindowX);
980         napi_set_named_property(env_, objValueClickEvent, "windowX", napiWindowX);
981     }
982     napi_value napiWindowY = GetNamedProperty(env_, objValueClickEvent, "windowY");
983     if (GetValueType(env_, napiWindowY) != napi_null) {
984         napi_create_double(env_, globalOffset.GetY() / scale, &napiWindowY);
985         napi_set_named_property(env_, objValueClickEvent, "windowY", napiWindowY);
986     }
987     napi_value napiGlobalDisplayX = GetNamedProperty(env_, objValueClickEvent, "globalDisplayX");
988     if (GetValueType(env_, napiGlobalDisplayX) != napi_null) {
989         napi_create_double(env_, globalDisplayOffset.GetX() / scale, &napiGlobalDisplayX);
990         napi_set_named_property(env_, objValueClickEvent, "globalDisplayX", napiGlobalDisplayX);
991     }
992     napi_value napiGlobalDisplayY = GetNamedProperty(env_, objValueClickEvent, "globalDisplayY");
993     if (GetValueType(env_, napiGlobalDisplayY) != napi_null) {
994         napi_create_double(env_, globalDisplayOffset.GetY() / scale, &napiGlobalDisplayY);
995         napi_set_named_property(env_, objValueClickEvent, "globalDisplayY", napiGlobalDisplayY);
996     }
997     napi_close_handle_scope(env_, scope);
998 }
999 
AddClickEventInfoTwo(napi_value objValueClickEvent,const ClickInfo & clickInfo)1000 void UIObserverListener::AddClickEventInfoTwo(napi_value objValueClickEvent, const ClickInfo& clickInfo)
1001 {
1002     napi_handle_scope scope = nullptr;
1003     auto status = napi_open_handle_scope(env_, &scope);
1004     if (status != napi_ok) {
1005         return;
1006     }
1007 
1008     double scale = Dimension(1.0, DimensionUnit::VP).ConvertToPx();
1009     if (NearZero(scale)) {
1010         scale = 1.0;
1011     }
1012     Offset globalOffset = clickInfo.GetGlobalLocation();
1013     Offset localOffset = clickInfo.GetLocalLocation();
1014     napi_value napiScreenX = GetNamedProperty(env_, objValueClickEvent, "screenX");
1015     if (GetValueType(env_, napiScreenX) != napi_null) {
1016         napi_create_double(env_, globalOffset.GetX() / scale, &napiScreenX);
1017         napi_set_named_property(env_, objValueClickEvent, "screenX", napiScreenX);
1018     }
1019     napi_value napiScreenY = GetNamedProperty(env_, objValueClickEvent, "screenY");
1020     if (GetValueType(env_, napiScreenY) != napi_null) {
1021         napi_create_double(env_, globalOffset.GetY() / scale, &napiScreenY);
1022         napi_set_named_property(env_, objValueClickEvent, "screenY", napiScreenY);
1023     }
1024     napi_value napiX = GetNamedProperty(env_, objValueClickEvent, "x");
1025     if (GetValueType(env_, napiX) != napi_null) {
1026         napi_create_double(env_, localOffset.GetX() / scale, &napiX);
1027         napi_set_named_property(env_, objValueClickEvent, "x", napiX);
1028     }
1029     napi_value napiY = GetNamedProperty(env_, objValueClickEvent, "y");
1030     if (GetValueType(env_, napiY) != napi_null) {
1031         napi_create_double(env_, localOffset.GetY() / scale, &napiY);
1032         napi_set_named_property(env_, objValueClickEvent, "y", napiY);
1033     }
1034     AddTargetObject(objValueClickEvent, clickInfo);
1035     napi_close_handle_scope(env_, scope);
1036 }
1037 
AddGestureEventInfoFour(napi_value objValueEvent,const GestureEvent & gestureEventInfo)1038 void UIObserverListener::AddGestureEventInfoFour(napi_value objValueEvent, const GestureEvent& gestureEventInfo)
1039 {
1040     napi_handle_scope scope = nullptr;
1041     auto status = napi_open_handle_scope(env_, &scope);
1042     if (status != napi_ok) {
1043         return;
1044     }
1045 
1046     std::unique_ptr<GestureEvent> infoHolder = std::make_unique<GestureEvent>(gestureEventInfo);
1047     auto* info = infoHolder.release();
1048     status = napi_wrap(
1049         env_, objValueEvent, info,
1050         [](napi_env env, void* data, void* hint) {
1051             GestureEvent* info = reinterpret_cast<GestureEvent*>(data);
1052             if (info != nullptr) {
1053                 delete info;
1054             }
1055         },
1056         nullptr, nullptr);
1057     if (status != napi_ok) {
1058         LOGE("napi_wrap failed");
1059         delete info;
1060         napi_close_handle_scope(env_, scope);
1061         return;
1062     }
1063     napi_value funcValue = nullptr;
1064     napi_create_function(env_, GET_MODIFIER_KEY_STATE, 0, GetModifierKeyState, nullptr, &funcValue);
1065     napi_set_named_property(env_, objValueEvent, GET_MODIFIER_KEY_STATE, funcValue);
1066     napi_close_handle_scope(env_, scope);
1067 }
1068 
AddTargetObject(napi_value objValueEvent,const BaseEventInfo & baseEventInfo)1069 void UIObserverListener::AddTargetObject(napi_value objValueEvent, const BaseEventInfo& baseEventInfo)
1070 {
1071     napi_handle_scope scope = nullptr;
1072     auto status = napi_open_handle_scope(env_, &scope);
1073     if (status != napi_ok) {
1074         return;
1075     }
1076 
1077     napi_value napiTargetObject = nullptr;
1078     napi_create_object(env_, &napiTargetObject);
1079     const auto& localOffset = baseEventInfo.GetTarget().area.GetOffset();
1080     const auto& origin = baseEventInfo.GetTarget().origin;
1081 
1082     napi_value napiOffset = nullptr;
1083     napi_create_object(env_, &napiOffset);
1084     napi_value napiX = nullptr;
1085     napi_create_double(env_, localOffset.GetX().ConvertToVp(), &napiX);
1086     napi_set_named_property(env_, napiOffset, "x", napiX);
1087     napi_value napiY = nullptr;
1088     napi_create_double(env_, localOffset.GetY().ConvertToVp(), &napiY);
1089     napi_set_named_property(env_, napiOffset, "y", napiY);
1090 
1091     napi_value napiGlobalOffset = nullptr;
1092     napi_create_object(env_, &napiGlobalOffset);
1093     napi_value napiGlobalX = nullptr;
1094     napi_create_double(env_, localOffset.GetX().ConvertToVp() + origin.GetX().ConvertToVp(),
1095         &napiGlobalX);
1096     napi_set_named_property(env_, napiGlobalOffset, "x", napiGlobalX);
1097     napi_value napiGlobalY = nullptr;
1098     napi_create_double(env_, localOffset.GetY().ConvertToVp() + origin.GetY().ConvertToVp(),
1099         &napiGlobalY);
1100     napi_set_named_property(env_, napiGlobalOffset, "y", napiGlobalY);
1101 
1102     napi_value napiArea = nullptr;
1103     napi_create_object(env_, &napiArea);
1104     napi_set_named_property(env_, napiArea, "position", napiOffset);
1105     napi_set_named_property(env_, napiArea, "globalPosition", napiGlobalOffset);
1106     napi_value napiWidth = nullptr;
1107     napi_create_double(env_, baseEventInfo.GetTarget().area.GetWidth().ConvertToVp(), &napiWidth);
1108     napi_set_named_property(env_, napiArea, "width", napiWidth);
1109     napi_value napiHeight = nullptr;
1110     napi_create_double(env_, baseEventInfo.GetTarget().area.GetHeight().ConvertToVp(), &napiHeight);
1111     napi_set_named_property(env_, napiArea, "height", napiHeight);
1112     napi_set_named_property(env_, napiTargetObject, "area", napiArea);
1113     napi_value id = nullptr;
1114     napi_create_string_utf8(env_, baseEventInfo.GetTarget().id.c_str(), NAPI_AUTO_LENGTH, &id);
1115     napi_set_named_property(env_, napiTargetObject, "id", id);
1116 
1117     napi_set_named_property(env_, objValueEvent, "target", napiTargetObject);
1118     napi_close_handle_scope(env_, scope);
1119 }
1120 
CreateNavDestinationInfoObj(const NG::NavDestinationInfo & info)1121 napi_value UIObserverListener::CreateNavDestinationInfoObj(const NG::NavDestinationInfo& info)
1122 {
1123     napi_value objValue = nullptr;
1124     napi_create_object(env_, &objValue);
1125     napi_value napiNavId = nullptr;
1126     napi_value napiName = nullptr;
1127     napi_value napiState = nullptr;
1128     napi_value napiIdx = nullptr;
1129     napi_value napiNavDesId = nullptr;
1130     napi_create_string_utf8(env_, info.navigationId.c_str(), info.navigationId.length(), &napiNavId);
1131     napi_create_string_utf8(env_, info.name.c_str(), info.name.length(), &napiName);
1132     napi_create_int32(env_, static_cast<int32_t>(info.state), &napiState);
1133     napi_create_int32(env_, info.index, &napiIdx);
1134     napi_create_string_utf8(env_, info.navDestinationId.c_str(), info.navDestinationId.length(), &napiNavDesId);
1135     napi_set_named_property(env_, objValue, "navigationId", napiNavId);
1136     napi_set_named_property(env_, objValue, "name", napiName);
1137     napi_set_named_property(env_, objValue, "state", napiState);
1138     napi_set_named_property(env_, objValue, "index", napiIdx);
1139     napi_set_named_property(env_, objValue, "param", info.param);
1140     napi_set_named_property(env_, objValue, "navDestinationId", napiNavDesId);
1141     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FIFTEEN)) {
1142         napi_value napiMode = nullptr;
1143         napi_value napiUniqueId = nullptr;
1144         napi_create_int32(env_, static_cast<int32_t>(info.mode), &napiMode);
1145         napi_create_int32(env_, static_cast<int32_t>(info.uniqueId), &napiUniqueId);
1146         napi_set_named_property(env_, objValue, "mode", napiMode);
1147         napi_set_named_property(env_, objValue, "uniqueId", napiUniqueId);
1148     }
1149     return objValue;
1150 }
1151 
GetNapiCallback()1152 napi_value UIObserverListener::GetNapiCallback()
1153 {
1154     napi_value callback = nullptr;
1155     napi_get_reference_value(env_, callback_, &callback);
1156     return callback;
1157 }
1158 
GetFrameNodeObject(const RefPtr<NG::FrameNode> & frameNode)1159 napi_value UIObserverListener::GetFrameNodeObject(const RefPtr<NG::FrameNode>& frameNode)
1160 {
1161     CHECK_NULL_RETURN(frameNode, nullptr);
1162     auto container = Container::Current();
1163     CHECK_NULL_RETURN(container, nullptr);
1164 
1165     auto frontEnd = container->GetFrontend();
1166     CHECK_NULL_RETURN(frontEnd, nullptr);
1167 
1168     return frontEnd->GetFrameNodeValueByNodeId(frameNode->GetId());
1169 }
1170 
NapiEqual(napi_value cb)1171 bool UIObserverListener::NapiEqual(napi_value cb)
1172 {
1173     bool isEquals = false;
1174     napi_strict_equals(env_, cb, GetNapiCallback(), &isEquals);
1175     return isEquals;
1176 }
1177 } // namespace OHOS::Ace::Napi
1178