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