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 "interaction_manager_impl.h"
17
18 #include "devicestatus_define.h"
19 #include "drag_data.h"
20 #include "drag_manager_impl.h"
21
22 #undef LOG_TAG
23 #define LOG_TAG "InteractionManagerImpl"
24
25 namespace OHOS {
26 namespace Msdp {
27 namespace DeviceStatus {
28
InteractionManagerImpl()29 InteractionManagerImpl::InteractionManagerImpl() {}
30
~InteractionManagerImpl()31 InteractionManagerImpl::~InteractionManagerImpl() {}
32
InitClient()33 bool InteractionManagerImpl::InitClient()
34 {
35 CALL_DEBUG_ENTER;
36 if (client_ != nullptr && client_->CheckValidFd()) {
37 return true;
38 }
39 client_ = std::make_shared<Client>();
40 InitMsgHandler();
41 #ifdef OHOS_BUILD_ENABLE_COORDINATION
42 client_->RegisterConnectedFunction([&coordinationManagerImpl_] {
43 coordinationManagerImpl_->OnConnected();
44 });
45 #endif // OHOS_BUILD_ENABLE_COORDINATION
46 if (!(client_->Start())) {
47 client_.reset();
48 client_ = nullptr;
49 FI_HILOGE("The client failed to start");
50 return false;
51 }
52 return true;
53 }
54
InitMsgHandler()55 void InteractionManagerImpl::InitMsgHandler()
56 {
57 CALL_DEBUG_ENTER;
58 Client::MsgCallback funs[] = {
59 #ifdef OHOS_BUILD_ENABLE_COORDINATION
60 {MessageId::COORDINATION_ADD_LISTENER, [&coordinationManagerImpl_](const StreamClient &client, NetPacket &pkt) {
61 return coordinationManagerImpl_->OnCoordinationListener(client, pkt);
62 }},
63 {MessageId::COORDINATION_MESSAGE, [&coordinationManagerImpl_](const StreamClient &client, NetPacket &pkt) {
64 return coordinationManagerImpl_->OnCoordinationMessage(client, pkt);
65 }},
66 {MessageId::COORDINATION_GET_STATE, [&coordinationManagerImpl_](const StreamClient &client, NetPacket &pkt) {
67 return coordinationManagerImpl_->OnCoordinationState(client, pkt);
68 }},
69 {MessageId::HOT_AREA_ADD_LISTENER, [&coordinationManagerImpl_](const StreamClient &client, NetPacket &pkt) {
70 return coordinationManagerImpl_->OnHotAreaListener(client, pkt);
71 }},
72 #endif // OHOS_BUILD_ENABLE_COORDINATION
73 {MessageId::DRAG_NOTIFY_RESULT, [&dragManagerImpl_](const StreamClient &client, NetPacket &pkt) {
74 return dragManagerImpl_->OnNotifyResult(client, pkt);
75 }},
76 {MessageId::DRAG_STATE_LISTENER, [&dragManagerImpl_](const StreamClient &client, NetPacket &pkt) {
77 return dragManagerImpl_->OnStateChangedMessage(client, pkt);
78 }},
79 {MessageId::DRAG_NOTIFY_HIDE_ICON, [&dragManagerImpl_](const StreamClient &client, NetPacket &pkt) {
80 return dragManagerImpl_->OnNotifyHideIcon(client, pkt);
81 }},
82 {MessageId::DRAG_STYLE_LISTENER, [&dragManagerImpl_](const StreamClient &client, NetPacket &pkt) {
83 return dragManagerImpl_->OnDragStyleChangedMessage(client, pkt);
84 }}
85 };
86 CHKPV(client_);
87 for (auto &it : funs) {
88 if (!client_->RegisterEvent(it)) {
89 FI_HILOGI("RegisterEvent msg:%{public}d already exists", it.id);
90 }
91 }
92 }
93
RegisterCoordinationListener(std::shared_ptr<ICoordinationListener> listener,bool isCompatible)94 int32_t InteractionManagerImpl::RegisterCoordinationListener(std::shared_ptr<ICoordinationListener> listener,
95 bool isCompatible)
96 {
97 CALL_DEBUG_ENTER;
98 #ifdef OHOS_BUILD_ENABLE_COORDINATION
99 std::lock_guard<std::mutex> guard(mutex_);
100 if (!InitClient()) {
101 FI_HILOGE("Get client is nullptr");
102 return RET_ERR;
103 }
104 return coordinationManagerImpl_.RegisterCoordinationListener(listener, isCompatible);
105 #else
106 FI_HILOGW("Coordination does not support");
107 (void)(listener);
108 (void)(isCompatible);
109 return ERROR_UNSUPPORT;
110 #endif // OHOS_BUILD_ENABLE_COORDINATION
111 }
112
UnregisterCoordinationListener(std::shared_ptr<ICoordinationListener> listener,bool isCompatible)113 int32_t InteractionManagerImpl::UnregisterCoordinationListener(std::shared_ptr<ICoordinationListener> listener,
114 bool isCompatible)
115 {
116 CALL_DEBUG_ENTER;
117 #ifdef OHOS_BUILD_ENABLE_COORDINATION
118 std::lock_guard<std::mutex> guard(mutex_);
119 return coordinationManagerImpl_.UnregisterCoordinationListener(listener, isCompatible);
120 #else
121 FI_HILOGW("Coordination does not support");
122 (void)(listener);
123 (void)(isCompatible);
124 return ERROR_UNSUPPORT;
125 #endif // OHOS_BUILD_ENABLE_COORDINATION
126 }
127
PrepareCoordination(CooperateMsgInfoCallback callback,bool isCompatible)128 int32_t InteractionManagerImpl::PrepareCoordination(CooperateMsgInfoCallback callback, bool isCompatible)
129 {
130 CALL_INFO_TRACE;
131 #ifdef OHOS_BUILD_ENABLE_COORDINATION
132 std::lock_guard<std::mutex> guard(mutex_);
133 if (!InitClient()) {
134 FI_HILOGE("Get client is nullptr");
135 return RET_ERR;
136 }
137 return coordinationManagerImpl_.PrepareCoordination(callback, isCompatible);
138 #else
139 FI_HILOGW("Coordination does not support");
140 (void)(callback);
141 (void)(isCompatible);
142 return ERROR_UNSUPPORT;
143 #endif // OHOS_BUILD_ENABLE_COORDINATION
144 }
145
UnprepareCoordination(CooperateMsgInfoCallback callback,bool isCompatible)146 int32_t InteractionManagerImpl::UnprepareCoordination(CooperateMsgInfoCallback callback, bool isCompatible)
147 {
148 CALL_INFO_TRACE;
149 #ifdef OHOS_BUILD_ENABLE_COORDINATION
150 std::lock_guard<std::mutex> guard(mutex_);
151 if (!InitClient()) {
152 FI_HILOGE("Get client is nullptr");
153 return RET_ERR;
154 }
155 return coordinationManagerImpl_.UnprepareCoordination(callback, isCompatible);
156 #else
157 FI_HILOGW("Coordination does not support");
158 (void)(callback);
159 (void)(isCompatible);
160 return ERROR_UNSUPPORT;
161 #endif // OHOS_BUILD_ENABLE_COORDINATION
162 }
163
ActivateCoordination(const std::string & remoteNetworkId,int32_t startDeviceId,CooperateMsgInfoCallback callback,bool isCompatible)164 int32_t InteractionManagerImpl::ActivateCoordination(const std::string &remoteNetworkId, int32_t startDeviceId,
165 CooperateMsgInfoCallback callback, bool isCompatible)
166 {
167 CALL_INFO_TRACE;
168 #ifdef OHOS_BUILD_ENABLE_COORDINATION
169 std::lock_guard<std::mutex> guard(mutex_);
170 if (!InitClient()) {
171 FI_HILOGE("Get client is nullptr");
172 return RET_ERR;
173 }
174 return coordinationManagerImpl_.ActivateCoordination(remoteNetworkId, startDeviceId, callback, isCompatible);
175 #else
176 FI_HILOGW("Coordination does not support");
177 (void)(remoteNetworkId);
178 (void)(startDeviceId);
179 (void)(callback);
180 (void)(isCompatible);
181 return ERROR_UNSUPPORT;
182 #endif // OHOS_BUILD_ENABLE_COORDINATION
183 }
184
DeactivateCoordination(bool isUnchained,CooperateMsgInfoCallback callback,bool isCompatible)185 int32_t InteractionManagerImpl::DeactivateCoordination(bool isUnchained, CooperateMsgInfoCallback callback,
186 bool isCompatible)
187 {
188 CALL_INFO_TRACE;
189 #ifdef OHOS_BUILD_ENABLE_COORDINATION
190 std::lock_guard<std::mutex> guard(mutex_);
191 if (!InitClient()) {
192 FI_HILOGE("Get client is nullptr");
193 return RET_ERR;
194 }
195 return coordinationManagerImpl_.DeactivateCoordination(isUnchained, callback, isCompatible);
196 #else
197 FI_HILOGW("Coordination does not support");
198 (void)(callback);
199 (void)(isCompatible);
200 return ERROR_UNSUPPORT;
201 #endif // OHOS_BUILD_ENABLE_COORDINATION
202 }
203
GetCoordinationState(const std::string & networkId,std::function<void (bool)> callback,bool isCompatible)204 int32_t InteractionManagerImpl::GetCoordinationState(
205 const std::string &networkId, std::function<void(bool)> callback, bool isCompatible)
206 {
207 CALL_DEBUG_ENTER;
208 #ifdef OHOS_BUILD_ENABLE_COORDINATION
209 std::lock_guard<std::mutex> guard(mutex_);
210 if (!InitClient()) {
211 FI_HILOGE("Get client is nullptr");
212 return RET_ERR;
213 }
214 return coordinationManagerImpl_.GetCoordinationState(networkId, callback, isCompatible);
215 #else
216 (void)(networkId);
217 (void)(callback);
218 (void)(isCompatible);
219 FI_HILOGW("Coordination does not support");
220 return ERROR_UNSUPPORT;
221 #endif // OHOS_BUILD_ENABLE_COORDINATION
222 }
223
GetCoordinationState(const std::string & udId,bool & state)224 int32_t InteractionManagerImpl::GetCoordinationState(const std::string &udId, bool &state)
225 {
226 CALL_DEBUG_ENTER;
227 #ifdef OHOS_BUILD_ENABLE_COORDINATION
228 std::lock_guard<std::mutex> guard(mutex_);
229 if (!InitClient()) {
230 FI_HILOGE("Get client is nullptr");
231 return RET_ERR;
232 }
233 return coordinationManagerImpl_.GetCoordinationState(udId, state);
234 #else
235 (void)(udId);
236 (void)(state);
237 FI_HILOGW("Coordination does not support");
238 return ERROR_UNSUPPORT;
239 #endif // OHOS_BUILD_ENABLE_COORDINATION
240 }
241
UpdateDragStyle(DragCursorStyle style)242 int32_t InteractionManagerImpl::UpdateDragStyle(DragCursorStyle style)
243 {
244 CALL_DEBUG_ENTER;
245 return dragManagerImpl_.UpdateDragStyle(style);
246 }
247
StartDrag(const DragData & dragData,std::shared_ptr<IStartDragListener> listener)248 int32_t InteractionManagerImpl::StartDrag(const DragData &dragData, std::shared_ptr<IStartDragListener> listener)
249 {
250 CALL_DEBUG_ENTER;
251 std::lock_guard<std::mutex> guard(mutex_);
252 if (!InitClient()) {
253 FI_HILOGE("Get client is nullptr");
254 return RET_ERR;
255 }
256 return dragManagerImpl_.StartDrag(dragData, listener);
257 }
258
StopDrag(const DragDropResult & dropResult)259 int32_t InteractionManagerImpl::StopDrag(const DragDropResult &dropResult)
260 {
261 CALL_DEBUG_ENTER;
262 return dragManagerImpl_.StopDrag(dropResult);
263 }
264
GetDragTargetPid()265 int32_t InteractionManagerImpl::GetDragTargetPid()
266 {
267 CALL_DEBUG_ENTER;
268 return dragManagerImpl_.GetDragTargetPid();
269 }
270
GetUdKey(std::string & udKey)271 int32_t InteractionManagerImpl::GetUdKey(std::string &udKey)
272 {
273 CALL_DEBUG_ENTER;
274 return dragManagerImpl_.GetUdKey(udKey);
275 }
276
AddDraglistener(DragListenerPtr listener)277 int32_t InteractionManagerImpl::AddDraglistener(DragListenerPtr listener)
278 {
279 CALL_DEBUG_ENTER;
280 std::lock_guard<std::mutex> guard(mutex_);
281 if (!InitClient()) {
282 FI_HILOGE("Get client is nullptr");
283 return RET_ERR;
284 }
285 return dragManagerImpl_.AddDraglistener(listener);
286 }
287
RemoveDraglistener(DragListenerPtr listener)288 int32_t InteractionManagerImpl::RemoveDraglistener(DragListenerPtr listener)
289 {
290 CALL_DEBUG_ENTER;
291 return dragManagerImpl_.RemoveDraglistener(listener);
292 }
293
AddSubscriptListener(SubscriptListenerPtr listener)294 int32_t InteractionManagerImpl::AddSubscriptListener(SubscriptListenerPtr listener)
295 {
296 CALL_DEBUG_ENTER;
297 std::lock_guard<std::mutex> guard(mutex_);
298 if (!InitClient()) {
299 FI_HILOGE("Get client is nullptr");
300 return RET_ERR;
301 }
302 return dragManagerImpl_.AddSubscriptListener(listener);
303 }
304
RemoveSubscriptListener(SubscriptListenerPtr listener)305 int32_t InteractionManagerImpl::RemoveSubscriptListener(SubscriptListenerPtr listener)
306 {
307 CALL_DEBUG_ENTER;
308 return dragManagerImpl_.RemoveSubscriptListener(listener);
309 }
310
SetDragWindowVisible(bool visible,bool isForce)311 int32_t InteractionManagerImpl::SetDragWindowVisible(bool visible, bool isForce)
312 {
313 CALL_DEBUG_ENTER;
314 return dragManagerImpl_.SetDragWindowVisible(visible, isForce);
315 }
316
GetShadowOffset(ShadowOffset & shadowOffset)317 int32_t InteractionManagerImpl::GetShadowOffset(ShadowOffset &shadowOffset)
318 {
319 CALL_DEBUG_ENTER;
320 return dragManagerImpl_.GetShadowOffset(shadowOffset);
321 }
322
UpdateShadowPic(const ShadowInfo & shadowInfo)323 int32_t InteractionManagerImpl::UpdateShadowPic(const ShadowInfo &shadowInfo)
324 {
325 CALL_DEBUG_ENTER;
326 return dragManagerImpl_.UpdateShadowPic(shadowInfo);
327 }
328
GetDragData(DragData & dragData)329 int32_t InteractionManagerImpl::GetDragData(DragData &dragData)
330 {
331 CALL_DEBUG_ENTER;
332 return dragManagerImpl_.GetDragData(dragData);
333 }
334
GetDragState(DragState & dragState)335 int32_t InteractionManagerImpl::GetDragState(DragState &dragState)
336 {
337 CALL_DEBUG_ENTER;
338 return dragManagerImpl_.GetDragState(dragState);
339 }
340
GetDragAction(DragAction & dragAction)341 int32_t InteractionManagerImpl::GetDragAction(DragAction &dragAction)
342 {
343 CALL_DEBUG_ENTER;
344 return dragManagerImpl_.GetDragAction(dragAction);
345 }
346
GetExtraInfo(std::string & extraInfo)347 int32_t InteractionManagerImpl::GetExtraInfo(std::string &extraInfo)
348 {
349 CALL_DEBUG_ENTER;
350 return dragManagerImpl_.GetExtraInfo(extraInfo);
351 }
352
AddHotAreaListener(std::shared_ptr<IHotAreaListener> listener)353 int32_t InteractionManagerImpl::AddHotAreaListener(std::shared_ptr<IHotAreaListener> listener)
354 {
355 CALL_DEBUG_ENTER;
356 #ifdef OHOS_BUILD_ENABLE_COORDINATION
357 std::lock_guard<std::mutex> guard(mutex_);
358 if (!InitClient()) {
359 FI_HILOGE("Get client is nullptr");
360 return RET_ERR;
361 }
362 return coordinationManagerImpl_.AddHotAreaListener(listener);
363 #else
364 FI_HILOGW("Coordination does not support");
365 (void)(listener);
366 return ERROR_UNSUPPORT;
367 #endif // OHOS_BUILD_ENABLE_COORDINATION
368 }
369
RemoveHotAreaListener(std::shared_ptr<IHotAreaListener> listener)370 int32_t InteractionManagerImpl::RemoveHotAreaListener(std::shared_ptr<IHotAreaListener> listener)
371 {
372 CALL_DEBUG_ENTER;
373 #ifdef OHOS_BUILD_ENABLE_COORDINATION
374 std::lock_guard<std::mutex> guard(mutex_);
375 return coordinationManagerImpl_.RemoveHotAreaListener(listener);
376 #else
377 FI_HILOGW("Coordination does not support");
378 (void)(listener);
379 return ERROR_UNSUPPORT;
380 #endif // OHOS_BUILD_ENABLE_COORDINATION
381 }
382
UpdatePreviewStyle(const PreviewStyle & previewStyle)383 int32_t InteractionManagerImpl::UpdatePreviewStyle(const PreviewStyle &previewStyle)
384 {
385 CALL_DEBUG_ENTER;
386 return dragManagerImpl_.UpdatePreviewStyle(previewStyle);
387 }
388
UpdatePreviewStyleWithAnimation(const PreviewStyle & previewStyle,const PreviewAnimation & animation)389 int32_t InteractionManagerImpl::UpdatePreviewStyleWithAnimation(const PreviewStyle &previewStyle,
390 const PreviewAnimation &animation)
391 {
392 CALL_DEBUG_ENTER;
393 return dragManagerImpl_.UpdatePreviewStyleWithAnimation(previewStyle, animation);
394 }
395
GetDragSummary(std::map<std::string,int64_t> & summarys)396 int32_t InteractionManagerImpl::GetDragSummary(std::map<std::string, int64_t> &summarys)
397 {
398 CALL_DEBUG_ENTER;
399 return dragManagerImpl_.GetDragSummary(summarys);
400 }
401
EnterTextEditorArea(bool enable)402 int32_t InteractionManagerImpl::EnterTextEditorArea(bool enable)
403 {
404 CALL_DEBUG_ENTER;
405 return dragManagerImpl_.EnterTextEditorArea(enable);
406 }
407
AddPrivilege()408 int32_t InteractionManagerImpl::AddPrivilege()
409 {
410 CALL_DEBUG_ENTER;
411 return dragManagerImpl_.AddPrivilege();
412 }
413
EraseMouseIcon()414 int32_t InteractionManagerImpl::EraseMouseIcon()
415 {
416 CALL_DEBUG_ENTER;
417 return dragManagerImpl_.EraseMouseIcon();
418 }
419 } // namespace DeviceStatus
420 } // namespace Msdp
421 } // namespace OHOS
422