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