1 /*
2 * Copyright (c) 2025 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 "frameworks/bridge/declarative_frontend/engine/functions/js_common_utils.h"
17 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
18
19 namespace OHOS::Ace::Framework::CommonUtils {
20
CreateFingerInfo(const FingerInfo & fingerInfo)21 JSRef<JSObject> CreateFingerInfo(const FingerInfo& fingerInfo)
22 {
23 JSRef<JSObject> fingerInfoObj = JSRef<JSObject>::New();
24 const OHOS::Ace::Offset& globalLocation = fingerInfo.globalLocation_;
25 const OHOS::Ace::Offset& localLocation = fingerInfo.localLocation_;
26 const OHOS::Ace::Offset& screenLocation = fingerInfo.screenLocation_;
27 const OHOS::Ace::Offset& globalDisplayLocation = fingerInfo.globalDisplayLocation_;
28 fingerInfoObj->SetProperty<int32_t>("id", fingerInfo.fingerId_);
29 fingerInfoObj->SetProperty<int32_t>("hand", fingerInfo.operatingHand_);
30 fingerInfoObj->SetProperty<double>("globalX", PipelineBase::Px2VpWithCurrentDensity(globalLocation.GetX()));
31 fingerInfoObj->SetProperty<double>("globalY", PipelineBase::Px2VpWithCurrentDensity(globalLocation.GetY()));
32 fingerInfoObj->SetProperty<double>("localX", PipelineBase::Px2VpWithCurrentDensity(localLocation.GetX()));
33 fingerInfoObj->SetProperty<double>("localY", PipelineBase::Px2VpWithCurrentDensity(localLocation.GetY()));
34 fingerInfoObj->SetProperty<double>("displayX", PipelineBase::Px2VpWithCurrentDensity(screenLocation.GetX()));
35 fingerInfoObj->SetProperty<double>("displayY", PipelineBase::Px2VpWithCurrentDensity(screenLocation.GetY()));
36 fingerInfoObj->SetProperty<double>(
37 "globalDisplayX", PipelineBase::Px2VpWithCurrentDensity(globalDisplayLocation.GetX()));
38 fingerInfoObj->SetProperty<double>(
39 "globalDisplayY", PipelineBase::Px2VpWithCurrentDensity(globalDisplayLocation.GetY()));
40 return fingerInfoObj;
41 }
42
CreateEventTargetObject(const std::shared_ptr<BaseGestureEvent> & info)43 JSRef<JSObject> CreateEventTargetObject(const std::shared_ptr<BaseGestureEvent>& info)
44 {
45 JSRef<JSObjTemplate> objectTemplate = JSRef<JSObjTemplate>::New();
46 JSRef<JSObject> target = objectTemplate->NewInstance();
47 JSRef<JSObject> area = objectTemplate->NewInstance();
48 JSRef<JSObject> offset = objectTemplate->NewInstance();
49 JSRef<JSObject> globalOffset = objectTemplate->NewInstance();
50 const auto& localOffset = info->GetTarget().area.GetOffset();
51 const auto& origin = info->GetTarget().origin;
52 offset->SetProperty<double>("x", localOffset.GetX().ConvertToVp());
53 offset->SetProperty<double>("y", localOffset.GetY().ConvertToVp());
54 globalOffset->SetProperty<double>("x", (origin.GetX().ConvertToVp() + localOffset.GetX().ConvertToVp()));
55 globalOffset->SetProperty<double>("y", (origin.GetY().ConvertToVp() + localOffset.GetY().ConvertToVp()));
56 area->SetPropertyObject("position", offset);
57 area->SetPropertyObject("globalPosition", globalOffset);
58 area->SetProperty<double>("width", info->GetTarget().area.GetWidth().ConvertToVp());
59 area->SetProperty<double>("height", info->GetTarget().area.GetHeight().ConvertToVp());
60 target->SetPropertyObject("area", area);
61 if (!info->GetTarget().id.empty()) {
62 target->SetProperty<const char*>("id", info->GetTarget().id.c_str());
63 } else {
64 target->SetPropertyObject("id", JsiValue::Undefined());
65 }
66 return target;
67 }
68
CreateEventTargetObject(const BaseEventInfo & info)69 JSRef<JSObject> CreateEventTargetObject(const BaseEventInfo& info)
70 {
71 JSRef<JSObjTemplate> objectTemplate = JSRef<JSObjTemplate>::New();
72 JSRef<JSObject> target = objectTemplate->NewInstance();
73 JSRef<JSObject> area = objectTemplate->NewInstance();
74 JSRef<JSObject> offset = objectTemplate->NewInstance();
75 JSRef<JSObject> globalOffset = objectTemplate->NewInstance();
76 const auto& localOffset = info.GetTarget().area.GetOffset();
77 const auto& origin = info.GetTarget().origin;
78 offset->SetProperty<double>("x", localOffset.GetX().ConvertToVp());
79 offset->SetProperty<double>("y", localOffset.GetY().ConvertToVp());
80 globalOffset->SetProperty<double>("x", (origin.GetX().ConvertToVp() + localOffset.GetX().ConvertToVp()));
81 globalOffset->SetProperty<double>("y", (origin.GetY().ConvertToVp() + localOffset.GetY().ConvertToVp()));
82 area->SetPropertyObject("position", offset);
83 area->SetPropertyObject("globalPosition", globalOffset);
84 area->SetProperty<double>("width", info.GetTarget().area.GetWidth().ConvertToVp());
85 area->SetProperty<double>("height", info.GetTarget().area.GetHeight().ConvertToVp());
86 target->SetPropertyObject("area", area);
87 if (info.GetTarget().id.empty()) {
88 target->SetPropertyObject("id", JsiValue::Undefined());
89 } else {
90 target->SetProperty<const char*>("id", info.GetTarget().id.c_str());
91 }
92 return target;
93 }
94
SetBaseGestureEventInfo(JSRef<JSObject> obj,const std::shared_ptr<BaseGestureEvent> & info)95 bool SetBaseGestureEventInfo(JSRef<JSObject> obj, const std::shared_ptr<BaseGestureEvent>& info)
96 {
97 CHECK_NULL_RETURN(info, false);
98 obj->SetProperty<double>("timestamp", info->GetTimeStamp().time_since_epoch().count());
99 obj->SetProperty<double>("source", static_cast<int32_t>(info->GetSourceDevice()));
100 obj->SetProperty<double>("pressure", info->GetForce());
101 obj->SetProperty<double>("tiltX", info->GetTiltX().value_or(0.0f));
102 obj->SetProperty<double>("tiltY", info->GetTiltY().value_or(0.0f));
103 obj->SetProperty<double>("rollAngle", info->GetRollAngle().value_or(0.0f));
104 obj->SetProperty<double>("sourceTool", static_cast<int32_t>(info->GetSourceTool()));
105 obj->SetProperty<double>("deviceId", static_cast<int32_t>(info->GetDeviceId()));
106 obj->SetProperty<int32_t>("targetDisplayId", info->GetTargetDisplayId());
107 obj->SetProperty<float>("axisVertical", info->GetVerticalAxis());
108 obj->SetProperty<float>("axisHorizontal", info->GetHorizontalAxis());
109 obj->SetPropertyObject(
110 "getModifierKeyState", JSRef<JSFunc>::New<FunctionCallback>(NG::ArkTSUtils::JsGetModifierKeyState));
111 CreateFingerInfosObject(info, obj);
112 return true;
113 }
114
CreateFingerInfosObject(const std::shared_ptr<BaseGestureEvent> & info,JSRef<JSObject> & obj)115 JSRef<JSObject> CreateFingerInfosObject(const std::shared_ptr<BaseGestureEvent>& info, JSRef<JSObject>& obj)
116 {
117 JSRef<JSArray> fingerArr = JSRef<JSArray>::New();
118 const std::list<FingerInfo>& fingerList = info->GetFingerList();
119 std::list<FingerInfo> notTouchFingerList;
120 std::vector<JSRef<JSObject>> validFingers;
121 for (const FingerInfo& fingerInfo : fingerList) {
122 JSRef<JSObject> element = CreateFingerInfo(fingerInfo);
123 if (fingerInfo.sourceType_ == SourceType::TOUCH && fingerInfo.sourceTool_ == SourceTool::FINGER) {
124 validFingers.emplace_back(element);
125 } else {
126 notTouchFingerList.emplace_back(fingerInfo);
127 }
128 }
129 for (size_t i = 0; i < validFingers.size(); ++i) {
130 fingerArr->SetValueAt(i, validFingers[i]);
131 }
132 auto idx = validFingers.size();
133 for (const FingerInfo& fingerInfo : notTouchFingerList) {
134 JSRef<JSObject> element = CreateFingerInfo(fingerInfo);
135 fingerArr->SetValueAt(idx++, element);
136 }
137 obj->SetPropertyObject("fingerInfos", fingerArr);
138 return obj;
139 }
140 } // namespace OHOS::Ace::Framework::CommonUtils
141