1 /*
2 * Copyright (c) 2024 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
17 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_component_id_ffi.h"
18
19 #include "core/common/container_scope.h"
20 #include "core/common/container.h"
21 #include "core/components_ng/base/inspector.h"
22 #include "core/components_v2/inspector/inspector.h"
23
24 using namespace OHOS::Ace;
25 using namespace OHOS::Ace::Framework;
26 using namespace OHOS::Ace::V2;
27
28 extern "C" {
FfiOHOSAceFrameworkComponentIdGetInspectorByKey(const char * id)29 ExternalString FfiOHOSAceFrameworkComponentIdGetInspectorByKey(const char* id)
30 {
31 ContainerScope scope{Container::CurrentIdSafely()};
32 auto container = Container::Current();
33 if (!container) {
34 return {};
35 }
36 std::string key = id;
37 auto resultStr = NG::Inspector::GetInspectorNodeByKey(key);
38 return Utils::MallocCString(resultStr);
39 }
40
FfiOHOSAceFrameworkComponentIdGetInspectorTree()41 ExternalString FfiOHOSAceFrameworkComponentIdGetInspectorTree()
42 {
43 ContainerScope scope{Container::CurrentIdSafely()};
44 auto container = Container::Current();
45 if (!container) {
46 return {};
47 }
48 auto nodeInfos = NG::Inspector::GetInspector();
49 return Utils::MallocCString(nodeInfos);
50 }
51
FfiOHOSAceFrameworkComponentIdSendEventByKey(char * id,int action,char * params)52 bool FfiOHOSAceFrameworkComponentIdSendEventByKey(char* id, int action, char* params)
53 {
54 ContainerScope scope{Container::CurrentIdSafely()};
55 auto container = Container::Current();
56 if (!container) {
57 return false;
58 }
59 std::string key = id;
60 std::string s_params = params;
61 auto result = NG::Inspector::SendEventByKey(key, action, s_params);
62 return result;
63 }
64
GetTouchPointFromCJ(const CJTouchInfo & cJTouchInfo)65 static TouchEvent GetTouchPointFromCJ(const CJTouchInfo& cJTouchInfo)
66 {
67 TouchEvent touchPoint;
68 touchPoint.type = static_cast<TouchType>(cJTouchInfo.type);
69 touchPoint.id = cJTouchInfo.fingerId;
70 touchPoint.x = cJTouchInfo.localX;
71 touchPoint.y = cJTouchInfo.localY;
72 touchPoint.time = std::chrono::high_resolution_clock::now();
73 return touchPoint;
74 }
75
GetKeyEventFromCJ(const CJKeyEvent & cJKeyEvent)76 static KeyEvent GetKeyEventFromCJ(const CJKeyEvent& cJKeyEvent)
77 {
78 auto action = static_cast<KeyAction>(cJKeyEvent.type);
79 auto code = static_cast<KeyCode>(cJKeyEvent.keyCode);
80 KeyEvent keyEvent(code, action);
81 keyEvent.sourceType = static_cast<SourceType>(cJKeyEvent.keySource);
82 keyEvent.deviceId = cJKeyEvent.deviceId;
83 keyEvent.metaKey = cJKeyEvent.metaKey;
84 auto timeStamp = cJKeyEvent.timestamp;
85 keyEvent.SetTimeStamp(timeStamp);
86 return keyEvent;
87 }
88
GetMouseEventFromCJ(const CJMouseEvent & cJMouseEvent)89 static MouseEvent GetMouseEventFromCJ(const CJMouseEvent& cJMouseEvent)
90 {
91 MouseEvent mouseEvent;
92 mouseEvent.action = static_cast<MouseAction>(cJMouseEvent.action);
93 mouseEvent.button = static_cast<MouseButton>(cJMouseEvent.button);
94 mouseEvent.x = cJMouseEvent.x;
95 mouseEvent.deltaX = mouseEvent.x;
96 mouseEvent.y = cJMouseEvent.y;
97 mouseEvent.deltaY = mouseEvent.y;
98 mouseEvent.time = std::chrono::high_resolution_clock::now();
99 mouseEvent.sourceType = SourceType::MOUSE;
100 return mouseEvent;
101 }
102
FfiOHOSAceFrameworkComponentIdSendTouchEvent(CJTouchInfo cJTouchInfo)103 bool FfiOHOSAceFrameworkComponentIdSendTouchEvent(CJTouchInfo cJTouchInfo)
104 {
105 ContainerScope scope{Container::CurrentIdSafely()};
106 auto container = Container::Current();
107 if (!container) {
108 return false;
109 }
110 auto pipelineContext = container->GetPipelineContext();
111 if (pipelineContext == nullptr) {
112 return false;
113 }
114 TouchEvent touchPoint = GetTouchPointFromCJ(cJTouchInfo);
115 auto result = pipelineContext->GetTaskExecutor()->PostTask(
116 [pipelineContext, touchPoint]() { pipelineContext->OnTouchEvent(touchPoint); }, TaskExecutor::TaskType::UI,
117 "FfiOHOSAceFrameworkComponentIdSendTouchEvent");
118 return result;
119 }
120
FfiOHOSAceFrameworkComponentIdSendKeyEvent(CJKeyEvent cJKeyEvent)121 bool FfiOHOSAceFrameworkComponentIdSendKeyEvent(CJKeyEvent cJKeyEvent)
122 {
123 ContainerScope scope{Container::CurrentIdSafely()};
124 auto container = Container::Current();
125 if (!container) {
126 return false;
127 }
128 auto pipelineContext = container->GetPipelineContext();
129 if (pipelineContext == nullptr) {
130 return false;
131 }
132 KeyEvent keyEvent = GetKeyEventFromCJ(cJKeyEvent);
133 auto result = pipelineContext->GetTaskExecutor()->PostTask(
134 [pipelineContext, keyEvent]() { pipelineContext->OnKeyEvent(keyEvent); }, TaskExecutor::TaskType::UI,
135 "FfiOHOSAceFrameworkComponentIdSendKeyEvent");
136 return result;
137 }
138
FfiOHOSAceFrameworkComponentIdSendMouseEvent(CJMouseEvent cJMouseEvent)139 bool FfiOHOSAceFrameworkComponentIdSendMouseEvent(CJMouseEvent cJMouseEvent)
140 {
141 ContainerScope scope{Container::CurrentIdSafely()};
142 auto container = Container::Current();
143 if (!container) {
144 return false;
145 }
146 auto pipelineContext = container->GetPipelineContext();
147 if (pipelineContext == nullptr) {
148 return false;
149 }
150 MouseEvent mouseEvent = GetMouseEventFromCJ(cJMouseEvent);
151 auto result = pipelineContext->GetTaskExecutor()->PostTask(
152 [pipelineContext, mouseEvent]() { pipelineContext->OnMouseEvent(mouseEvent); }, TaskExecutor::TaskType::UI,
153 "FfiOHOSAceFrameworkComponentIdSendMouseEvent");
154 return result;
155 }
156 }