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), ¤tPhase);
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(), ¶m1);
569 napi_create_int32(env_, tabContentInfo.tabContentUniqueId, ¶m2);
570 napi_create_int32(env_, static_cast<int32_t>(tabContentInfo.state), ¶m3);
571 napi_create_int32(env_, tabContentInfo.index, ¶m4);
572 napi_create_string_utf8(env_, tabContentInfo.id.c_str(), tabContentInfo.id.length(), ¶m5);
573 napi_create_int32(env_, tabContentInfo.uniqueId, ¶m6);
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