• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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