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