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_manager_impl.h"
17 
18 #include "devicestatus_client.h"
19 #include "devicestatus_define.h"
20 #include "drag_data.h"
21 #include "drag_data_packer.h"
22 
23 #undef LOG_TAG
24 #define LOG_TAG "DragManagerImpl"
25 
26 namespace OHOS {
27 namespace Msdp {
28 namespace DeviceStatus {
29 
UpdateDragStyle(DragCursorStyle style)30 int32_t DragManagerImpl::UpdateDragStyle(DragCursorStyle style)
31 {
32     CALL_DEBUG_ENTER;
33     if ((style < DragCursorStyle::DEFAULT) || (style > DragCursorStyle::MOVE)) {
34         FI_HILOGE("Invalid style:%{public}d", static_cast<int32_t>(style));
35         return RET_ERR;
36     }
37     FI_HILOGD("Ready to modify the style(%{public}d)", static_cast<int32_t>(style));
38     return DeviceStatusClient::GetInstance().UpdateDragStyle(style);
39 }
40 
StartDrag(const DragData & dragData,std::shared_ptr<IStartDragListener> listener)41 int32_t DragManagerImpl::StartDrag(const DragData &dragData, std::shared_ptr<IStartDragListener> listener)
42 {
43     CALL_DEBUG_ENTER;
44     CHKPR(listener, RET_ERR);
45     if (DragDataPacker::CheckDragData(dragData) != RET_OK) {
46         FI_HILOGE("CheckDragData failed");
47         return RET_ERR;
48     }
49     {
50         std::lock_guard<std::mutex> guard(mtx_);
51         startDragListener_ = listener;
52     }
53     return DeviceStatusClient::GetInstance().StartDrag(dragData);
54 }
55 
StopDrag(const DragDropResult & dropResult)56 int32_t DragManagerImpl::StopDrag(const DragDropResult &dropResult)
57 {
58     CALL_DEBUG_ENTER;
59     return DeviceStatusClient::GetInstance().StopDrag(dropResult);
60 }
61 
GetDragTargetPid()62 int32_t DragManagerImpl::GetDragTargetPid()
63 {
64     CALL_DEBUG_ENTER;
65     return DeviceStatusClient::GetInstance().GetDragTargetPid();
66 }
67 
GetUdKey(std::string & udKey)68 int32_t DragManagerImpl::GetUdKey(std::string &udKey)
69 {
70     CALL_DEBUG_ENTER;
71     return DeviceStatusClient::GetInstance().GetUdKey(udKey);
72 }
73 
OnNotifyResult(const StreamClient & client,NetPacket & pkt)74 int32_t DragManagerImpl::OnNotifyResult(const StreamClient &client, NetPacket &pkt)
75 {
76     CALL_DEBUG_ENTER;
77     DragNotifyMsg notifyMsg;
78     int32_t result = 0;
79     int32_t dragBehavior = -1;
80     pkt >> notifyMsg.displayX >> notifyMsg.displayY >> result >> notifyMsg.targetPid >> dragBehavior;
81     if (pkt.ChkRWError()) {
82         FI_HILOGE("Packet read drag msg failed");
83         return RET_ERR;
84     }
85     if ((result < static_cast<int32_t>(DragResult::DRAG_SUCCESS)) ||
86         (result > static_cast<int32_t>(DragResult::DRAG_EXCEPTION))) {
87         FI_HILOGE("Invalid result:%{public}d", result);
88         return RET_ERR;
89     }
90     notifyMsg.result = static_cast<DragResult>(result);
91     if ((dragBehavior < static_cast<int32_t>(DragBehavior::UNKNOWN)) ||
92         (dragBehavior > static_cast<int32_t>(DragBehavior::MOVE))) {
93         FI_HILOGE("Invalid dragBehavior:%{public}d", dragBehavior);
94         return RET_ERR;
95     }
96     notifyMsg.dragBehavior = static_cast<DragBehavior>(dragBehavior);
97     std::lock_guard<std::mutex> guard(mtx_);
98     CHKPR(startDragListener_, RET_ERR);
99     startDragListener_->OnDragEndMessage(notifyMsg);
100     return RET_OK;
101 }
102 
OnNotifyHideIcon(const StreamClient & client,NetPacket & pkt)103 int32_t DragManagerImpl::OnNotifyHideIcon(const StreamClient& client, NetPacket& pkt)
104 {
105     CALL_DEBUG_ENTER;
106     std::lock_guard<std::mutex> guard(mtx_);
107     CHKPR(startDragListener_, RET_ERR);
108     startDragListener_->OnHideIconMessage();
109     return RET_OK;
110 }
111 
OnStateChangedMessage(const StreamClient & client,NetPacket & pkt)112 int32_t DragManagerImpl::OnStateChangedMessage(const StreamClient &client, NetPacket &pkt)
113 {
114     CALL_DEBUG_ENTER;
115     int32_t state = 0;
116     pkt >> state;
117     if (pkt.ChkRWError()) {
118         FI_HILOGE("Packet read drag msg failed");
119         return RET_ERR;
120     }
121     std::lock_guard<std::mutex> guard(mtx_);
122     for (const auto &listener : dragListener_) {
123         listener->OnDragMessage(static_cast<DragState>(state));
124     }
125     return RET_OK;
126 }
127 
OnDragStyleChangedMessage(const StreamClient & client,NetPacket & pkt)128 int32_t DragManagerImpl::OnDragStyleChangedMessage(const StreamClient &client, NetPacket &pkt)
129 {
130     CALL_DEBUG_ENTER;
131     int32_t style = 0;
132     pkt >> style;
133     if (pkt.ChkRWError()) {
134         FI_HILOGE("Packet read drag msg failed");
135         return RET_ERR;
136     }
137     std::lock_guard<std::mutex> guard(mtx_);
138     for (const auto &listener : subscriptListener_) {
139         listener->OnMessage(static_cast<DragCursorStyle>(style));
140     }
141     return RET_OK;
142 }
143 
AddDraglistener(DragListenerPtr listener)144 int32_t DragManagerImpl::AddDraglistener(DragListenerPtr listener)
145 {
146     CALL_INFO_TRACE;
147     CHKPR(listener, RET_ERR);
148     std::lock_guard<std::mutex> guard(mtx_);
149     if (!hasRegistered_) {
150         FI_HILOGI("Start monitoring");
151         int32_t ret = DeviceStatusClient::GetInstance().AddDraglistener();
152         if (ret != RET_OK) {
153             FI_HILOGE("Failed to register draglistener");
154             return ret;
155         }
156         hasRegistered_ = true;
157     }
158     if (std::all_of(dragListener_.cbegin(), dragListener_.cend(),
159                     [listener](DragListenerPtr tListener) {
160                         return (tListener != listener);
161                     })) {
162         dragListener_.push_back(listener);
163     } else {
164         FI_HILOGW("The draglistener already exists");
165     }
166     return RET_OK;
167 }
168 
RemoveDraglistener(DragListenerPtr listener)169 int32_t DragManagerImpl::RemoveDraglistener(DragListenerPtr listener)
170 {
171     CALL_INFO_TRACE;
172     std::lock_guard<std::mutex> guard(mtx_);
173     if (listener == nullptr) {
174         dragListener_.clear();
175     } else {
176         dragListener_.erase(std::remove_if(dragListener_.begin(), dragListener_.end(),
177             [listener] (auto lIter) {
178                 return lIter == listener;
179             })
180         );
181     }
182 
183     if (hasRegistered_ && dragListener_.empty()) {
184         hasRegistered_ = false;
185         return DeviceStatusClient::GetInstance().RemoveDraglistener();
186     }
187     return RET_OK;
188 }
189 
AddSubscriptListener(SubscriptListenerPtr listener)190 int32_t DragManagerImpl::AddSubscriptListener(SubscriptListenerPtr listener)
191 {
192     CALL_INFO_TRACE;
193     CHKPR(listener, RET_ERR);
194     std::lock_guard<std::mutex> guard(mtx_);
195     if (!hasSubscriptRegistered_) {
196         FI_HILOGI("Start monitoring");
197         int32_t ret = DeviceStatusClient::GetInstance().AddSubscriptListener();
198         if (ret != RET_OK) {
199             FI_HILOGE("Failed to register");
200             return ret;
201         }
202         hasSubscriptRegistered_ = true;
203     }
204     if (std::all_of(subscriptListener_.cbegin(), subscriptListener_.cend(),
205                     [listener](SubscriptListenerPtr tListener) {
206                         return (tListener != listener);
207                     })) {
208         subscriptListener_.push_back(listener);
209     } else {
210         FI_HILOGW("The listener already exists");
211     }
212     return RET_OK;
213 }
214 
RemoveSubscriptListener(SubscriptListenerPtr listener)215 int32_t DragManagerImpl::RemoveSubscriptListener(SubscriptListenerPtr listener)
216 {
217     CALL_INFO_TRACE;
218     std::lock_guard<std::mutex> guard(mtx_);
219     if (listener == nullptr) {
220         subscriptListener_.clear();
221     } else {
222         subscriptListener_.erase(std::remove_if(subscriptListener_.begin(), subscriptListener_.end(),
223             [listener] (auto iter) {
224                 return iter == listener;
225             })
226         );
227     }
228 
229     if (hasSubscriptRegistered_ && subscriptListener_.empty()) {
230         hasSubscriptRegistered_ = false;
231         return DeviceStatusClient::GetInstance().RemoveSubscriptListener();
232     }
233     return RET_OK;
234 }
235 
SetDragWindowVisible(bool visible,bool isForce)236 int32_t DragManagerImpl::SetDragWindowVisible(bool visible, bool isForce)
237 {
238     CALL_DEBUG_ENTER;
239     return DeviceStatusClient::GetInstance().SetDragWindowVisible(visible, isForce);
240 }
241 
GetShadowOffset(ShadowOffset & shadowOffset)242 int32_t DragManagerImpl::GetShadowOffset(ShadowOffset &shadowOffset)
243 {
244     CALL_DEBUG_ENTER;
245     return DeviceStatusClient::GetInstance().GetShadowOffset(shadowOffset);
246 }
247 
UpdateShadowPic(const ShadowInfo & shadowInfo)248 int32_t DragManagerImpl::UpdateShadowPic(const ShadowInfo &shadowInfo)
249 {
250     CALL_DEBUG_ENTER;
251     if (ShadowPacker::CheckShadowInfo(shadowInfo) != RET_OK) {
252         FI_HILOGE("CheckShadowInfo failed");
253         return RET_ERR;
254     }
255     return DeviceStatusClient::GetInstance().UpdateShadowPic(shadowInfo);
256 }
257 
GetDragData(DragData & dragData)258 int32_t DragManagerImpl::GetDragData(DragData &dragData)
259 {
260     CALL_DEBUG_ENTER;
261     return DeviceStatusClient::GetInstance().GetDragData(dragData);
262 }
263 
GetDragState(DragState & dragState)264 int32_t DragManagerImpl::GetDragState(DragState &dragState)
265 {
266     CALL_DEBUG_ENTER;
267     return DeviceStatusClient::GetInstance().GetDragState(dragState);
268 }
269 
UpdatePreviewStyle(const PreviewStyle & previewStyle)270 int32_t DragManagerImpl::UpdatePreviewStyle(const PreviewStyle &previewStyle)
271 {
272     return DeviceStatusClient::GetInstance().UpdatePreviewStyle(previewStyle);
273 }
274 
UpdatePreviewStyleWithAnimation(const PreviewStyle & previewStyle,const PreviewAnimation & animation)275 int32_t DragManagerImpl::UpdatePreviewStyleWithAnimation(const PreviewStyle &previewStyle,
276     const PreviewAnimation &animation)
277 {
278     return DeviceStatusClient::GetInstance().UpdatePreviewStyleWithAnimation(previewStyle, animation);
279 }
280 
GetDragSummary(std::map<std::string,int64_t> & summarys)281 int32_t DragManagerImpl::GetDragSummary(std::map<std::string, int64_t> &summarys)
282 {
283     CALL_DEBUG_ENTER;
284     return DeviceStatusClient::GetInstance().GetDragSummary(summarys);
285 }
286 
GetDragAction(DragAction & dragAction)287 int32_t DragManagerImpl::GetDragAction(DragAction &dragAction)
288 {
289     return DeviceStatusClient::GetInstance().GetDragAction(dragAction);
290 }
291 
EnterTextEditorArea(bool enable)292 int32_t DragManagerImpl::EnterTextEditorArea(bool enable)
293 {
294     return DeviceStatusClient::GetInstance().EnterTextEditorArea(enable);
295 }
296 
GetExtraInfo(std::string & extraInfo)297 int32_t DragManagerImpl::GetExtraInfo(std::string &extraInfo)
298 {
299     return DeviceStatusClient::GetInstance().GetExtraInfo(extraInfo);
300 }
301 
AddPrivilege()302 int32_t DragManagerImpl::AddPrivilege()
303 {
304     return DeviceStatusClient::GetInstance().AddPrivilege();
305 }
306 
EraseMouseIcon()307 int32_t DragManagerImpl::EraseMouseIcon()
308 {
309     return DeviceStatusClient::GetInstance().EraseMouseIcon();
310 }
311 } // namespace DeviceStatus
312 } // namespace Msdp
313 } // namespace OHOS
314