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 "drag_client.h"
17
18 #include "default_params.h"
19 #include "drag_params.h"
20 #include "devicestatus_define.h"
21 #include "devicestatus_proto.h"
22
23 #undef LOG_TAG
24 #define LOG_TAG "DragClient"
25
26 namespace OHOS {
27 namespace Msdp {
28 namespace DeviceStatus {
29
StartDrag(ITunnelClient & tunnel,const DragData & dragData,std::shared_ptr<IStartDragListener> listener)30 int32_t DragClient::StartDrag(ITunnelClient &tunnel,
31 const DragData &dragData, std::shared_ptr<IStartDragListener> listener)
32 {
33 CALL_DEBUG_ENTER;
34 CHKPR(listener, RET_ERR);
35 if (dragData.shadowInfos.empty()) {
36 FI_HILOGE("shadowInfos is empty");
37 return ERR_INVALID_VALUE;
38 }
39 for (const auto& shadowInfo : dragData.shadowInfos) {
40 CHKPR(shadowInfo.pixelMap, RET_ERR);
41 if ((shadowInfo.x > 0) || (shadowInfo.y > 0) ||
42 (shadowInfo.x < -shadowInfo.pixelMap->GetWidth()) ||
43 (shadowInfo.y < -shadowInfo.pixelMap->GetHeight())) {
44 FI_HILOGE("Invalid parameter, shadowInfox:%{private}d, shadowInfoy:%{private}d",
45 shadowInfo.x, shadowInfo.y);
46 return RET_ERR;
47 }
48 }
49 if ((dragData.dragNum <= 0) || (dragData.buffer.size() > MAX_BUFFER_SIZE) ||
50 (dragData.displayX < 0) || (dragData.displayY < 0)) {
51 FI_HILOGE("Start drag, invalid argument, dragNum:%{public}d, bufferSize:%{public}zu, "
52 "displayX:%{private}d, displayY:%{private}d",
53 dragData.dragNum, dragData.buffer.size(), dragData.displayX, dragData.displayY);
54 return RET_ERR;
55 }
56 {
57 std::lock_guard<std::mutex> guard(mtx_);
58 startDragListener_ = listener;
59 }
60 StartDragParam param { dragData };
61 DefaultReply reply {};
62
63 int32_t ret = tunnel.Start(Intention::DRAG, param, reply);
64 if (ret != RET_OK) {
65 FI_HILOGE("ITunnelClient::Start fail");
66 }
67 return ret;
68 }
69
StopDrag(ITunnelClient & tunnel,const DragDropResult & dropResult)70 int32_t DragClient::StopDrag(ITunnelClient &tunnel, const DragDropResult &dropResult)
71 {
72 CALL_DEBUG_ENTER;
73 StopDragParam param { dropResult };
74 DefaultReply reply;
75
76 int32_t ret = tunnel.Stop(Intention::DRAG, param, reply);
77 if (ret != RET_OK) {
78 FI_HILOGE("ITunnelClient::Start fail");
79 }
80 return ret;
81 }
82
AddDraglistener(ITunnelClient & tunnel,DragListenerPtr listener,bool isJsCaller)83 int32_t DragClient::AddDraglistener(ITunnelClient &tunnel, DragListenerPtr listener, bool isJsCaller)
84 {
85 CALL_DEBUG_ENTER;
86 CHKPR(listener, RET_ERR);
87 std::lock_guard<std::mutex> guard(mtx_);
88 if (dragListeners_.find(listener) != dragListeners_.end()) {
89 return RET_OK;
90 }
91 if (!hasRegistered_) {
92 AddDraglistenerParam param { isJsCaller };
93 DefaultReply reply {};
94 FI_HILOGI("Start drag listening");
95
96 int32_t ret = tunnel.AddWatch(Intention::DRAG, DragRequestID::ADD_DRAG_LISTENER, param, reply);
97 if (ret != RET_OK) {
98 FI_HILOGE("ITunnelClient::AddWatch fail");
99 return ret;
100 }
101 hasRegistered_ = true;
102 }
103 dragListeners_.insert(listener);
104 return RET_OK;
105 }
106
RemoveDraglistener(ITunnelClient & tunnel,DragListenerPtr listener,bool isJsCaller)107 int32_t DragClient::RemoveDraglistener(ITunnelClient &tunnel, DragListenerPtr listener, bool isJsCaller)
108 {
109 CALL_DEBUG_ENTER;
110 std::lock_guard<std::mutex> guard(mtx_);
111 if (listener == nullptr) {
112 dragListeners_.clear();
113 } else {
114 dragListeners_.erase(listener);
115 }
116 if (hasRegistered_ && dragListeners_.empty()) {
117 hasRegistered_ = false;
118 RemoveDraglistenerParam param { isJsCaller };
119 DefaultReply reply {};
120 FI_HILOGI("Stop drag listening");
121
122 int32_t ret = tunnel.RemoveWatch(Intention::DRAG, DragRequestID::REMOVE_DRAG_LISTENER, param, reply);
123 if (ret != RET_OK) {
124 FI_HILOGE("ITunnelClient::RemoveWatch fail");
125 return ret;
126 }
127 }
128 return RET_OK;
129 }
130
AddSubscriptListener(ITunnelClient & tunnel,SubscriptListenerPtr listener)131 int32_t DragClient::AddSubscriptListener(ITunnelClient &tunnel, SubscriptListenerPtr listener)
132 {
133 CHKPR(listener, RET_ERR);
134 std::lock_guard<std::mutex> guard(mtx_);
135 if (subscriptListeners_.find(listener) != subscriptListeners_.end()) {
136 return RET_OK;
137 }
138 if (!hasSubscriptRegistered_) {
139 DefaultParam param {};
140 DefaultReply reply {};
141 FI_HILOGI("Start subscript listening");
142
143 int32_t ret = tunnel.AddWatch(Intention::DRAG, DragRequestID::ADD_SUBSCRIPT_LISTENER, param, reply);
144 if (ret != RET_OK) {
145 FI_HILOGE("ITunnelClient::AddWatch fail");
146 return ret;
147 }
148 hasSubscriptRegistered_ = true;
149 }
150 subscriptListeners_.insert(listener);
151 return RET_OK;
152 }
153
RemoveSubscriptListener(ITunnelClient & tunnel,SubscriptListenerPtr listener)154 int32_t DragClient::RemoveSubscriptListener(ITunnelClient &tunnel, SubscriptListenerPtr listener)
155 {
156 std::lock_guard<std::mutex> guard(mtx_);
157 if (listener == nullptr) {
158 subscriptListeners_.clear();
159 } else {
160 subscriptListeners_.erase(listener);
161 }
162 if (hasSubscriptRegistered_ && subscriptListeners_.empty()) {
163 hasSubscriptRegistered_ = false;
164 DefaultParam param {};
165 DefaultReply reply {};
166 FI_HILOGI("Stop subscript listening");
167
168 int32_t ret = tunnel.RemoveWatch(Intention::DRAG, DragRequestID::REMOVE_SUBSCRIPT_LISTENER, param, reply);
169 if (ret != RET_OK) {
170 FI_HILOGE("ITunnelClient::RemoveWatch fail");
171 return ret;
172 }
173 }
174 return RET_OK;
175 }
176
SetDragWindowVisible(ITunnelClient & tunnel,bool visible,bool isForce)177 int32_t DragClient::SetDragWindowVisible(ITunnelClient &tunnel, bool visible, bool isForce)
178 {
179 SetDragWindowVisibleParam param { visible, isForce };
180 DefaultReply reply {};
181
182 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::SET_DRAG_WINDOW_VISIBLE, param, reply);
183 if (ret != RET_OK) {
184 FI_HILOGE("ITunnelClient::SetParam fail");
185 }
186 return ret;
187 }
188
UpdateDragStyle(ITunnelClient & tunnel,DragCursorStyle style,int32_t eventId)189 int32_t DragClient::UpdateDragStyle(ITunnelClient &tunnel, DragCursorStyle style, int32_t eventId)
190 {
191 if ((style < DragCursorStyle::DEFAULT) || (style > DragCursorStyle::MOVE)) {
192 FI_HILOGE("Invalid style:%{public}d", static_cast<int32_t>(style));
193 return RET_ERR;
194 }
195 UpdateDragStyleParam param { style, eventId };
196 DefaultReply reply {};
197
198 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::UPDATE_DRAG_STYLE, param, reply);
199 if (ret != RET_OK) {
200 FI_HILOGE("ITunnelClient::SetParam fail");
201 }
202 return ret;
203 }
204
UpdateShadowPic(ITunnelClient & tunnel,const ShadowInfo & shadowInfo)205 int32_t DragClient::UpdateShadowPic(ITunnelClient &tunnel, const ShadowInfo &shadowInfo)
206 {
207 CALL_DEBUG_ENTER;
208 CHKPR(shadowInfo.pixelMap, RET_ERR);
209 if ((shadowInfo.x > 0) || (shadowInfo.y > 0) ||
210 (shadowInfo.x < -shadowInfo.pixelMap->GetWidth()) ||
211 (shadowInfo.y < -shadowInfo.pixelMap->GetHeight())) {
212 FI_HILOGE("Invalid parameter, shadowInfox:%{private}d, shadowInfoy:%{private}d",
213 shadowInfo.x, shadowInfo.y);
214 return RET_ERR;
215 }
216 UpdateShadowPicParam param { shadowInfo };
217 DefaultReply reply {};
218
219 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::UPDATE_SHADOW_PIC, param, reply);
220 if (ret != RET_OK) {
221 FI_HILOGE("ITunnelClient::SetParam fail");
222 }
223 return ret;
224 }
225
GetDragTargetPid(ITunnelClient & tunnel)226 int32_t DragClient::GetDragTargetPid(ITunnelClient &tunnel)
227 {
228 CALL_DEBUG_ENTER;
229 DefaultParam param {};
230 GetDragTargetPidReply reply {};
231
232 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_TARGET_PID, param, reply);
233 if (ret != RET_OK) {
234 FI_HILOGE("ITunnelClient::GetParam fail");
235 return -1;
236 }
237 return reply.targetPid_;
238 }
239
GetUdKey(ITunnelClient & tunnel,std::string & udKey)240 int32_t DragClient::GetUdKey(ITunnelClient &tunnel, std::string &udKey)
241 {
242 DefaultParam param {};
243 GetUdKeyReply reply {};
244
245 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_UDKEY, param, reply);
246 if (ret != RET_OK) {
247 FI_HILOGE("ITunnelClient::GetParam fail");
248 return ret;
249 }
250 udKey = reply.udKey_;
251 FI_HILOGI("UdKey:%{public}s", reply.udKey_.c_str());
252 return RET_OK;
253 }
254
GetShadowOffset(ITunnelClient & tunnel,ShadowOffset & shadowOffset)255 int32_t DragClient::GetShadowOffset(ITunnelClient &tunnel, ShadowOffset &shadowOffset)
256 {
257 DefaultParam param {};
258 GetShadowOffsetReply reply {};
259
260 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_SHADOW_OFFSET, param, reply);
261 if (ret != RET_OK) {
262 FI_HILOGE("ITunnelClient::GetParam fail");
263 return ret;
264 }
265 shadowOffset = reply.shadowOffset_;
266 return RET_OK;
267 }
268
GetDragData(ITunnelClient & tunnel,DragData & dragData)269 int32_t DragClient::GetDragData(ITunnelClient &tunnel, DragData &dragData)
270 {
271 CALL_DEBUG_ENTER;
272 DefaultParam param {};
273 GetDragDataReply reply { dragData };
274
275 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_DATA, param, reply);
276 if (ret != RET_OK) {
277 FI_HILOGE("ITunnelClient::GetParam fail");
278 }
279 return ret;
280 }
281
UpdatePreviewStyle(ITunnelClient & tunnel,const PreviewStyle & previewStyle)282 int32_t DragClient::UpdatePreviewStyle(ITunnelClient &tunnel, const PreviewStyle &previewStyle)
283 {
284 UpdatePreviewStyleParam param { previewStyle };
285 DefaultReply reply {};
286
287 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::UPDATE_PREVIEW_STYLE, param, reply);
288 if (ret != RET_OK) {
289 FI_HILOGE("ITunnelClient::SetParam fail");
290 }
291 return ret;
292 }
293
UpdatePreviewStyleWithAnimation(ITunnelClient & tunnel,const PreviewStyle & previewStyle,const PreviewAnimation & animation)294 int32_t DragClient::UpdatePreviewStyleWithAnimation(ITunnelClient &tunnel,
295 const PreviewStyle &previewStyle, const PreviewAnimation &animation)
296 {
297 UpdatePreviewAnimationParam param { previewStyle, animation };
298 DefaultReply reply {};
299
300 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::UPDATE_PREVIEW_STYLE_WITH_ANIMATION, param, reply);
301 if (ret != RET_OK) {
302 FI_HILOGE("ITunnelClient::SetParam fail");
303 }
304 return ret;
305 }
306
RotateDragWindowSync(ITunnelClient & tunnel,const std::shared_ptr<Rosen::RSTransaction> & rsTransaction)307 int32_t DragClient::RotateDragWindowSync(ITunnelClient &tunnel,
308 const std::shared_ptr<Rosen::RSTransaction>& rsTransaction)
309 {
310 RotateDragWindowSyncParam param { rsTransaction };
311 DefaultReply reply {};
312
313 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::ROTATE_DRAG_WINDOW_SYNC, param, reply);
314 if (ret != RET_OK) {
315 FI_HILOGE("ITunnelClient::Control fail");
316 }
317 return ret;
318 }
319
SetDragWindowScreenId(ITunnelClient & tunnel,uint64_t displayId,uint64_t screenId)320 int32_t DragClient::SetDragWindowScreenId(ITunnelClient &tunnel, uint64_t displayId, uint64_t screenId)
321 {
322 SetDragWindowScreenIdParam param { displayId, screenId };
323 DefaultReply reply {};
324
325 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::SET_DRAG_WINDOW_SCREEN_ID, param, reply);
326 if (ret != RET_OK) {
327 FI_HILOGE("ITunnelClient::SetParam fail");
328 }
329 return ret;
330 }
331
GetDragSummary(ITunnelClient & tunnel,std::map<std::string,int64_t> & summary,bool isJsCaller)332 int32_t DragClient::GetDragSummary(ITunnelClient &tunnel, std::map<std::string, int64_t> &summary,
333 bool isJsCaller)
334 {
335 GetDragSummaryParam param { isJsCaller };
336 GetDragSummaryReply reply {};
337
338 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_SUMMARY, param, reply);
339 if (ret != RET_OK) {
340 FI_HILOGE("ITunnelClient::GetParam fail");
341 return ret;
342 }
343 summary.swap(reply.summary_);
344 return RET_OK;
345 }
346
SetDragSwitchState(ITunnelClient & tunnel,bool enable,bool isJsCaller)347 int32_t DragClient::SetDragSwitchState(ITunnelClient &tunnel, bool enable, bool isJsCaller)
348 {
349 SetDragSwitchStateParam param { enable, isJsCaller };
350 DefaultReply reply {};
351
352 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::SET_DRAG_SWITCH_STATE, param, reply);
353 if (ret != RET_OK) {
354 FI_HILOGE("ITunnelClient::SetParam fail, %{public}d", ret);
355 }
356 return ret;
357 }
358
SetAppDragSwitchState(ITunnelClient & tunnel,bool enable,const std::string & pkgName,bool isJsCaller)359 int32_t DragClient::SetAppDragSwitchState(ITunnelClient &tunnel, bool enable, const std::string &pkgName,
360 bool isJsCaller)
361 {
362 SetAppDragSwitchStateParam param { enable, pkgName, isJsCaller };
363 DefaultReply reply {};
364
365 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::SET_APP_DRAG_SWITCH_STATE, param, reply);
366 if (ret != RET_OK) {
367 FI_HILOGE("ITunnelClient::SetParam fail, %{public}d", ret);
368 }
369 return ret;
370 }
371
GetDragState(ITunnelClient & tunnel,DragState & dragState)372 int32_t DragClient::GetDragState(ITunnelClient &tunnel, DragState &dragState)
373 {
374 DefaultParam param {};
375 GetDragStateReply reply {};
376
377 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_STATE, param, reply);
378 if (ret != RET_OK) {
379 FI_HILOGE("ITunnelClient::GetParam fail");
380 return ret;
381 }
382 dragState = reply.dragState_;
383 return RET_OK;
384 }
385
EnableUpperCenterMode(ITunnelClient & tunnel,bool enable)386 int32_t DragClient::EnableUpperCenterMode(ITunnelClient &tunnel, bool enable)
387 {
388 EnterTextEditorAreaParam param { enable };
389 DefaultReply reply {};
390
391 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::ENTER_TEXT_EDITOR_AREA, param, reply);
392 if (ret != RET_OK) {
393 FI_HILOGE("ITunnelClient::Control fail");
394 }
395 return ret;
396 }
397
GetDragAction(ITunnelClient & tunnel,DragAction & dragAction)398 int32_t DragClient::GetDragAction(ITunnelClient &tunnel, DragAction &dragAction)
399 {
400 DefaultParam param {};
401 GetDragActionReply reply {};
402
403 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_ACTION, param, reply);
404 if (ret != RET_OK) {
405 FI_HILOGE("ITunnelClient::GetParam fail");
406 return ret;
407 }
408 dragAction = reply.dragAction_;
409 return RET_OK;
410 }
411
GetExtraInfo(ITunnelClient & tunnel,std::string & extraInfo)412 int32_t DragClient::GetExtraInfo(ITunnelClient &tunnel, std::string &extraInfo)
413 {
414 DefaultParam param {};
415 GetExtraInfoReply reply {};
416
417 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_EXTRA_INFO, param, reply);
418 if (ret != RET_OK) {
419 FI_HILOGE("ITunnelClient::GetParam fail");
420 return ret;
421 }
422 extraInfo = std::move(reply.extraInfo_);
423 return RET_OK;
424 }
425
AddPrivilege(ITunnelClient & tunnel)426 int32_t DragClient::AddPrivilege(ITunnelClient &tunnel)
427 {
428 DefaultParam param {};
429 DefaultReply reply {};
430
431 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::ADD_PRIVILEGE, param, reply);
432 if (ret != RET_OK) {
433 FI_HILOGE("ITunnelClient::Control fail");
434 }
435 return ret;
436 }
437
EraseMouseIcon(ITunnelClient & tunnel)438 int32_t DragClient::EraseMouseIcon(ITunnelClient &tunnel)
439 {
440 DefaultParam param {};
441 DefaultReply reply {};
442
443 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::ERASE_MOUSE_ICON, param, reply);
444 if (ret != RET_OK) {
445 FI_HILOGE("ITunnelClient::Control fail");
446 }
447 return ret;
448 }
449
SetMouseDragMonitorState(ITunnelClient & tunnel,bool state)450 int32_t DragClient::SetMouseDragMonitorState(ITunnelClient &tunnel, bool state)
451 {
452 SetMouseDragMonitorStateParam param { state };
453 DefaultReply reply {};
454
455 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::SET_MOUSE_DRAG_MONITOR_STATE, param, reply);
456 if (ret != RET_OK) {
457 FI_HILOGE("ITunnelClient::Control fail");
458 }
459 return ret;
460 }
461
AddSelectedPixelMap(ITunnelClient & tunnel,std::shared_ptr<OHOS::Media::PixelMap> pixelMap,std::function<void (bool)> callback)462 int32_t DragClient::AddSelectedPixelMap(ITunnelClient &tunnel, std::shared_ptr<OHOS::Media::PixelMap> pixelMap,
463 std::function<void(bool)> callback)
464 {
465 CALL_DEBUG_ENTER;
466 CHKPR(pixelMap, RET_ERR);
467 CHKPR(callback, RET_ERR);
468 std::lock_guard<std::mutex> guard(mtx_);
469 addSelectedPixelMapCallback_ = callback;
470 AddSelectedPixelMapParam param { pixelMap };
471 DefaultReply reply {};
472
473 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::ADD_SELECTED_PIXELMAP, param, reply);
474 if (ret != RET_OK) {
475 FI_HILOGE("ITunnelClient::SetParam fail");
476 }
477 return ret;
478 }
479
OnAddSelectedPixelMapResult(const StreamClient & client,NetPacket & pkt)480 int32_t DragClient::OnAddSelectedPixelMapResult(const StreamClient &client, NetPacket &pkt)
481 {
482 CALL_DEBUG_ENTER;
483 bool result = false;
484
485 pkt >> result;
486 if (pkt.ChkRWError()) {
487 FI_HILOGE("Packet read addSelectedPixelMap msg failed");
488 return RET_ERR;
489 }
490 std::lock_guard<std::mutex> guard(mtx_);
491 CHKPR(addSelectedPixelMapCallback_, RET_ERR);
492 addSelectedPixelMapCallback_(result);
493 return RET_OK;
494 }
495
OnNotifyResult(const StreamClient & client,NetPacket & pkt)496 int32_t DragClient::OnNotifyResult(const StreamClient &client, NetPacket &pkt)
497 {
498 CALL_DEBUG_ENTER;
499 DragNotifyMsg notifyMsg;
500 int32_t result = 0;
501 int32_t dragBehavior = -1;
502 pkt >> notifyMsg.displayX >> notifyMsg.displayY >> result >> notifyMsg.targetPid >> dragBehavior;
503 if (pkt.ChkRWError()) {
504 FI_HILOGE("Packet read drag msg failed");
505 return RET_ERR;
506 }
507 if ((result < static_cast<int32_t>(DragResult::DRAG_SUCCESS)) ||
508 (result > static_cast<int32_t>(DragResult::DRAG_EXCEPTION))) {
509 FI_HILOGE("Invalid result:%{public}d", result);
510 return RET_ERR;
511 }
512 notifyMsg.result = static_cast<DragResult>(result);
513 if ((dragBehavior < static_cast<int32_t>(DragBehavior::UNKNOWN)) ||
514 (dragBehavior > static_cast<int32_t>(DragBehavior::MOVE))) {
515 FI_HILOGE("Invalid dragBehavior:%{public}d", dragBehavior);
516 return RET_ERR;
517 }
518 notifyMsg.dragBehavior = static_cast<DragBehavior>(dragBehavior);
519 std::lock_guard<std::mutex> guard(mtx_);
520 CHKPR(startDragListener_, RET_ERR);
521 startDragListener_->OnDragEndMessage(notifyMsg);
522 return RET_OK;
523 }
524
OnNotifyHideIcon(const StreamClient & client,NetPacket & pkt)525 int32_t DragClient::OnNotifyHideIcon(const StreamClient& client, NetPacket& pkt)
526 {
527 CALL_DEBUG_ENTER;
528 std::lock_guard<std::mutex> guard(mtx_);
529 CHKPR(startDragListener_, RET_ERR);
530 startDragListener_->OnHideIconMessage();
531 return RET_OK;
532 }
533
SetDraggableState(ITunnelClient & tunnel,bool state)534 int32_t DragClient::SetDraggableState(ITunnelClient &tunnel, bool state)
535 {
536 SetDraggableStateParam param {state};
537 DefaultReply reply {};
538 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::SET_DRAGGABLE_STATE, param, reply);
539 if (ret != RET_OK) {
540 FI_HILOGE("ITunnelClient::SetParam fail");
541 }
542 return ret;
543 }
544
GetAppDragSwitchState(ITunnelClient & tunnel,bool & state)545 int32_t DragClient::GetAppDragSwitchState(ITunnelClient &tunnel, bool &state)
546 {
547 DefaultParam param {};
548 GetUniversalDragAppStateReply reply {};
549
550 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_UNIVERSAL_DRAG_APP_STATE, param, reply);
551 if (ret != RET_OK) {
552 FI_HILOGE("ITunnelClient::GetParam fail");
553 return ret;
554 }
555
556 state = reply.state_;
557 return RET_OK;
558 }
559
SetDraggableStateAsync(ITunnelClient & tunnel,bool state,int64_t downTime)560 void DragClient::SetDraggableStateAsync(ITunnelClient &tunnel, bool state, int64_t downTime)
561 {
562 SetDraggableStateAsyncParam param {state, downTime};
563 DefaultReply reply {};
564 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::SET_DRAGABLE_STATE_ASYNC, param, reply);
565 if (ret != RET_OK) {
566 FI_HILOGE("ITunnelClient::SetParam fail");
567 }
568 }
569
OnStateChangedMessage(const StreamClient & client,NetPacket & pkt)570 int32_t DragClient::OnStateChangedMessage(const StreamClient &client, NetPacket &pkt)
571 {
572 CALL_DEBUG_ENTER;
573 int32_t state = 0;
574 pkt >> state;
575 if (pkt.ChkRWError()) {
576 FI_HILOGE("Packet read drag msg failed");
577 return RET_ERR;
578 }
579 std::lock_guard<std::mutex> guard(mtx_);
580 for (const auto &listener : dragListeners_) {
581 listener->OnDragMessage(static_cast<DragState>(state));
582 }
583 return RET_OK;
584 }
585
OnDragStyleChangedMessage(const StreamClient & client,NetPacket & pkt)586 int32_t DragClient::OnDragStyleChangedMessage(const StreamClient &client, NetPacket &pkt)
587 {
588 CALL_DEBUG_ENTER;
589 int32_t style = 0;
590 pkt >> style;
591 if (pkt.ChkRWError()) {
592 FI_HILOGE("Packet read drag msg failed");
593 return RET_ERR;
594 }
595 std::lock_guard<std::mutex> guard(mtx_);
596 for (const auto &listener : subscriptListeners_) {
597 listener->OnMessage(static_cast<DragCursorStyle>(style));
598 }
599 return RET_OK;
600 }
601
OnConnected(ITunnelClient & tunnel)602 void DragClient::OnConnected(ITunnelClient &tunnel)
603 {
604 CALL_INFO_TRACE;
605 if (connectedDragListeners_.empty()) {
606 FI_HILOGE("The connect drag listener set is empty");
607 return;
608 }
609 for (const auto &listener : connectedDragListeners_) {
610 if (AddDraglistener(tunnel, listener) != RET_OK) {
611 FI_HILOGW("AddDraglistener failed");
612 }
613 }
614 connectedDragListeners_.clear();
615 }
616
OnDisconnected(ITunnelClient & tunnel)617 void DragClient::OnDisconnected(ITunnelClient &tunnel)
618 {
619 CALL_INFO_TRACE;
620 std::lock_guard<std::mutex> guard(mtx_);
621 if (dragListeners_.empty()) {
622 FI_HILOGE("The drag listener set is empty");
623 return;
624 }
625 connectedDragListeners_ = dragListeners_;
626 dragListeners_.clear();
627 hasRegistered_ = false;
628 }
629 } // namespace DeviceStatus
630 } // namespace Msdp
631 } // namespace OHOS
632