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 }