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 "input_binding.h"
17 
18 #include <vector>
19 
20 #include "input_manager.h"
21 
22 #include "devicestatus_define.h"
23 #include "input_binding_internal.h"
24 
25 #undef LOG_TAG
26 #define LOG_TAG "InputBinding"
27 
28 namespace {
29 #define INPUT_MANAGER OHOS::MMI::InputManager::GetInstance()
30 } // namespace
31 
DragMonitorConsumer(void (* cb)(CPointerEvent *))32 DragMonitorConsumer::DragMonitorConsumer(void (*cb)(CPointerEvent *)) : callback_(cb)
33 {
34 }
35 
OnInputEvent(std::shared_ptr<OHOS::MMI::AxisEvent> axisEvent) const36 void DragMonitorConsumer::OnInputEvent(std::shared_ptr<OHOS::MMI::AxisEvent> axisEvent) const
37 {
38 }
39 
OnInputEvent(std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent) const40 void DragMonitorConsumer::OnInputEvent(std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent) const
41 {
42 }
43 
OnInputEvent(std::shared_ptr<OHOS::MMI::PointerEvent> pointerEvent) const44 void DragMonitorConsumer::OnInputEvent(std::shared_ptr<OHOS::MMI::PointerEvent> pointerEvent) const
45 {
46     CALL_DEBUG_ENTER;
47     CHKPV(pointerEvent);
48     auto cPointerEvent = new (std::nothrow) CPointerEvent(pointerEvent);
49     CHKPV(cPointerEvent);
50     CHKPV(callback_);
51     callback_(cPointerEvent);
52 }
53 
CGetPointerId(const CPointerEvent * cPointerEvent)54 int32_t CGetPointerId(const CPointerEvent* cPointerEvent)
55 {
56     CALL_DEBUG_ENTER;
57     CHKPR(cPointerEvent, RET_ERR);
58     CHKPR(cPointerEvent->event, RET_ERR);
59     return cPointerEvent->event->GetPointerId();
60 }
61 
CGetPointerAction(const CPointerEvent * cPointerEvent)62 int32_t CGetPointerAction(const CPointerEvent* cPointerEvent)
63 {
64     CALL_DEBUG_ENTER;
65     CHKPR(cPointerEvent, RET_ERR);
66     CHKPR(cPointerEvent->event, RET_ERR);
67     auto ret = cPointerEvent->event->GetPointerAction();
68     FI_HILOGD("action:%{public}d", ret);
69     return ret;
70 }
71 
CGetTargetWindowId(const CPointerEvent * cPointerEvent)72 int32_t CGetTargetWindowId(const CPointerEvent* cPointerEvent)
73 {
74     CALL_DEBUG_ENTER;
75     CHKPR(cPointerEvent, RET_ERR);
76     CHKPR(cPointerEvent->event, RET_ERR);
77     return cPointerEvent->event->GetTargetWindowId();
78 }
79 
CGetSourceType(const CPointerEvent * cPointerEvent)80 int32_t CGetSourceType(const CPointerEvent* cPointerEvent)
81 {
82     CALL_DEBUG_ENTER;
83     CHKPR(cPointerEvent, RET_ERR);
84     CHKPR(cPointerEvent->event, RET_ERR);
85     return cPointerEvent->event->GetSourceType();
86 }
87 
CGetTargetDisplayId(const CPointerEvent * cPointerEvent)88 int32_t CGetTargetDisplayId(const CPointerEvent* cPointerEvent)
89 {
90     CALL_DEBUG_ENTER;
91     CHKPR(cPointerEvent, RET_ERR);
92     CHKPR(cPointerEvent->event, RET_ERR);
93     return cPointerEvent->event->GetTargetDisplayId();
94 }
95 
CGetDisplayX(const CPointerEvent * cPointerEvent)96 int32_t CGetDisplayX(const CPointerEvent* cPointerEvent)
97 {
98     CALL_DEBUG_ENTER;
99     CHKPR(cPointerEvent, RET_ERR);
100     CHKPR(cPointerEvent->event, RET_ERR);
101     OHOS::MMI::PointerEvent::PointerItem pointerItem;
102     cPointerEvent->event->GetPointerItem(CGetPointerId(cPointerEvent), pointerItem);
103     return pointerItem.GetDisplayX();
104 }
105 
CGetDisplayY(const CPointerEvent * cPointerEvent)106 int32_t CGetDisplayY(const CPointerEvent* cPointerEvent)
107 {
108     CALL_DEBUG_ENTER;
109     CHKPR(cPointerEvent, RET_ERR);
110     CHKPR(cPointerEvent->event, RET_ERR);
111     OHOS::MMI::PointerEvent::PointerItem pointerItem;
112     cPointerEvent->event->GetPointerItem(CGetPointerId(cPointerEvent), pointerItem);
113     return pointerItem.GetDisplayY();
114 }
115 
CPointerEventAddFlag(const CPointerEvent * cPointerEvent)116 void CPointerEventAddFlag(const CPointerEvent* cPointerEvent)
117 {
118     CALL_DEBUG_ENTER;
119     CHKPV(cPointerEvent);
120     CHKPV(cPointerEvent->event);
121     cPointerEvent->event->AddFlag(OHOS::MMI::InputEvent::EVENT_FLAG_NO_INTERCEPT);
122 }
123 
CKeyEventAddFlag(const CKeyEvent * cKeyEvent)124 void CKeyEventAddFlag(const CKeyEvent* cKeyEvent)
125 {
126     CALL_DEBUG_ENTER;
127     CHKPV(cKeyEvent);
128     CHKPV(cKeyEvent->event);
129     cKeyEvent->event->AddFlag(OHOS::MMI::AxisEvent::EVENT_FLAG_NO_INTERCEPT);
130 }
131 
CGetDeviceId(const CPointerEvent * cPointerEvent)132 int32_t CGetDeviceId(const CPointerEvent* cPointerEvent)
133 {
134     CALL_DEBUG_ENTER;
135     CHKPR(cPointerEvent, RET_ERR);
136     CHKPR(cPointerEvent->event, RET_ERR);
137     return cPointerEvent->event->GetDeviceId();
138 }
139 
CGetKeyCode(const CKeyEvent * cKeyEvent)140 int32_t CGetKeyCode(const CKeyEvent* cKeyEvent)
141 {
142     CALL_DEBUG_ENTER;
143     CHKPR(cKeyEvent, RET_ERR);
144     CHKPR(cKeyEvent->event, RET_ERR);
145     return cKeyEvent->event->GetKeyCode();
146 }
147 
CAddMonitor(void (* callback)(CPointerEvent *))148 int32_t CAddMonitor(void (*callback)(CPointerEvent *))
149 {
150     CALL_DEBUG_ENTER;
151     CHKPR(callback, RET_ERR);
152     auto consumer = std::make_shared<DragMonitorConsumer>(callback);
153     auto ret = INPUT_MANAGER->AddMonitor(consumer);
154     if (ret < 0) {
155         FI_HILOGE("Failed to add monitor");
156         return RET_ERR;
157     }
158     return RET_OK;
159 }
160 
CGetWindowPid(const CPointerEvent * cPointerEvent)161 int32_t CGetWindowPid(const CPointerEvent* cPointerEvent)
162 {
163     CALL_DEBUG_ENTER;
164     CHKPR(cPointerEvent, RET_ERR);
165     CHKPR(cPointerEvent->event, RET_ERR);
166     return INPUT_MANAGER->GetWindowPid(CGetTargetWindowId(cPointerEvent));
167 }
168 
CGetPointerStyle(CPointerStyle * cPointerStyle)169 int32_t CGetPointerStyle(CPointerStyle* cPointerStyle)
170 {
171     CALL_DEBUG_ENTER;
172     CHKPR(cPointerStyle, RET_ERR);
173     OHOS::MMI::PointerStyle pointerStyle;
174     if (INPUT_MANAGER->GetPointerStyle(OHOS::MMI::GLOBAL_WINDOW_ID, pointerStyle) != RET_OK) {
175         FI_HILOGE("Failed to get pointer style");
176         return RET_ERR;
177     }
178 
179     cPointerStyle->size = pointerStyle.size;
180     cPointerStyle->color = pointerStyle.color;
181     cPointerStyle->id = pointerStyle.id;
182     return RET_OK;
183 }
184 
CAppendExtraData(CExtraData cExtraData)185 void CAppendExtraData(CExtraData cExtraData)
186 {
187     CALL_DEBUG_ENTER;
188     CHKPV(cExtraData.buffer);
189     uint8_t* uData = cExtraData.buffer;
190     CHKPV(uData);
191     OHOS::MMI::ExtraData extraData;
192     extraData.appended = cExtraData.appended;
193     extraData.pointerId = cExtraData.pointerId;
194     extraData.sourceType = cExtraData.sourceType;
195     for (size_t i = 0; i < cExtraData.bufferSize; ++i) {
196         extraData.buffer.emplace_back(*uData);
197         ++uData;
198     }
199     INPUT_MANAGER->AppendExtraData(extraData);
200 }
201 
CSetPointerVisible(bool visible)202 int32_t CSetPointerVisible(bool visible)
203 {
204     CALL_DEBUG_ENTER;
205     if (INPUT_MANAGER->SetPointerVisible(visible) != RET_OK) {
206         FI_HILOGE("Failed to set pointer visible");
207         return RET_ERR;
208     }
209     return RET_OK;
210 }
211 
CEnableInputDevice(bool enable)212 int32_t CEnableInputDevice(bool enable)
213 {
214     CALL_DEBUG_ENTER;
215     if (INPUT_MANAGER->EnableInputDevice(enable) != RET_OK) {
216         FI_HILOGE("Failed to enable input device");
217         return RET_ERR;
218     }
219     return RET_OK;
220 }
221 
CRemoveInputEventFilter(int32_t filterId)222 int32_t CRemoveInputEventFilter(int32_t filterId)
223 {
224     CALL_DEBUG_ENTER;
225     if (INPUT_MANAGER->RemoveInputEventFilter(filterId) != RET_OK) {
226         FI_HILOGE("Failed to remove input event filter");
227         return RET_ERR;
228     }
229     return RET_OK;
230 }
231 
CRemoveMonitor(int32_t monitorId)232 void CRemoveMonitor(int32_t monitorId)
233 {
234     CALL_DEBUG_ENTER;
235     INPUT_MANAGER->RemoveMonitor(monitorId);
236 }
237 
CRemoveInterceptor(int32_t interceptorId)238 void CRemoveInterceptor(int32_t interceptorId)
239 {
240     CALL_DEBUG_ENTER;
241     INPUT_MANAGER->RemoveInterceptor(interceptorId);
242 }
243 
CSetPointerLocation(int32_t physicalX,int32_t physicalY)244 void CSetPointerLocation(int32_t physicalX, int32_t physicalY)
245 {
246     CALL_DEBUG_ENTER;
247     INPUT_MANAGER->SetPointerLocation(physicalX, physicalY);
248 }
249 
CDestroyPointerEvent(CPointerEvent * cPointerEvent)250 void CDestroyPointerEvent(CPointerEvent* cPointerEvent)
251 {
252     CALL_DEBUG_ENTER;
253     CHKPV(cPointerEvent);
254     CHKPV(cPointerEvent->event);
255     cPointerEvent->event = nullptr;
256     delete cPointerEvent;
257 }