1 /*
2 * Copyright (c) 2023-2025 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 "cooperate_out.h"
17 #include "cooperate_hisysevent.h"
18
19 #include "devicestatus_define.h"
20 #include "utility.h"
21
22 #undef LOG_TAG
23 #define LOG_TAG "CooperateOut"
24
25 namespace OHOS {
26 namespace Msdp {
27 namespace DeviceStatus {
28 namespace Cooperate {
29
CooperateOut(IStateMachine & parent,IContext * env)30 CooperateOut::CooperateOut(IStateMachine &parent, IContext *env)
31 : ICooperateState(parent), env_(env)
32 {
33 initial_ = std::make_shared<Initial>(*this);
34 Initial::BuildChains(initial_, *this);
35 current_ = initial_;
36 }
37
~CooperateOut()38 CooperateOut::~CooperateOut()
39 {
40 Initial::RemoveChains(initial_);
41 }
42
OnEvent(Context & context,const CooperateEvent & event)43 void CooperateOut::OnEvent(Context &context, const CooperateEvent &event)
44 {
45 current_->OnEvent(context, event);
46 }
47
OnEnterState(Context & context)48 void CooperateOut::OnEnterState(Context &context)
49 {
50 CALL_INFO_TRACE;
51 int32_t ret = env_->GetInput().SetPointerVisibility(false);
52 if (ret != RET_OK) {
53 CooperateRadarInfo radarInfo {
54 .funcName = __FUNCTION__,
55 .bizState = static_cast<int32_t> (BizState::STATE_IDLE),
56 .bizStage = static_cast<int32_t> (BizCooperateStage::STAGE_SET_CURSOR_VISIBILITY),
57 .stageRes = static_cast<int32_t> (BizCooperateStageRes::RES_FAIL),
58 .bizScene = static_cast<int32_t> (BizCooperateScene::SCENE_ACTIVE),
59 .errCode = static_cast<int32_t> (CooperateRadarErrCode::SET_CURSOR_VISIBILITY_FAILED),
60 .hostName = "",
61 .localNetId = "",
62 .peerNetId = ""
63 };
64 CooperateRadar::ReportCooperateRadarInfo(radarInfo);
65 }
66 }
67
OnLeaveState(Context & context)68 void CooperateOut::OnLeaveState(Context &context)
69 {
70 CALL_INFO_TRACE;
71 SetPointerVisible(context);
72 }
73
SetPointerVisible(Context & context)74 void CooperateOut::SetPointerVisible(Context &context)
75 {
76 CHKPV(env_);
77 bool hasLocalPointerDevice = env_->GetDeviceManager().HasLocalPointerDevice() ||
78 env_->GetInput().HasLocalPointerDevice() ||
79 env_->GetDeviceManager().HasPencilAirMouse();
80 bool visible = !context.NeedHideCursor() && hasLocalPointerDevice;
81 FI_HILOGI("Set pointer visible:%{public}s, HasLocalPointerDevice:%{public}s",
82 visible ? "true" : "false", hasLocalPointerDevice ? "true" : "false");
83 env_->GetInput().SetPointerVisibility(visible, PRIORITY);
84 }
85
SimulateShowPointerEvent()86 void CooperateOut::SimulateShowPointerEvent()
87 {
88 CALL_INFO_TRACE;
89 CHKPV(env_);
90 auto pointerEvent = OHOS::MMI::PointerEvent::Create();
91 OHOS::MMI::PointerEvent::PointerItem item;
92 item.SetPointerId(0);
93 item.SetRawDx(0);
94 item.SetRawDy(0);
95 CHKPV(pointerEvent);
96 pointerEvent->SetPointerAction(OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE);
97 pointerEvent->AddFlag(OHOS::MMI::InputEvent::EVENT_FLAG_RAW_POINTER_MOVEMENT);
98 pointerEvent->SetPointerId(0);
99 pointerEvent->SetSourceType(OHOS::MMI::PointerEvent::SOURCE_TYPE_MOUSE);
100 pointerEvent->AddPointerItem(item);
101 env_->GetInput().SimulateInputEvent(pointerEvent);
102 }
103
BuildChains(std::shared_ptr<Initial> self,CooperateOut & parent)104 void CooperateOut::Initial::BuildChains(std::shared_ptr<Initial> self, CooperateOut &parent)
105 {}
106
RemoveChains(std::shared_ptr<Initial> self)107 void CooperateOut::Initial::RemoveChains(std::shared_ptr<Initial> self)
108 {}
109
Initial(CooperateOut & parent)110 CooperateOut::Initial::Initial(CooperateOut &parent)
111 : ICooperateStep(parent, nullptr), parent_(parent)
112 {
113 AddHandler(CooperateEventType::DISABLE, [this](Context &context, const CooperateEvent &event) {
114 this->OnDisable(context, event);
115 });
116 AddHandler(CooperateEventType::START, [this](Context &context, const CooperateEvent &event) {
117 this->OnStart(context, event);
118 });
119 AddHandler(CooperateEventType::WITH_OPTIONS_START, [this](Context &context, const CooperateEvent &event) {
120 this->OnStartWithOptions(context, event);
121 });
122 AddHandler(CooperateEventType::STOP, [this](Context &context, const CooperateEvent &event) {
123 this->OnStop(context, event);
124 });
125 AddHandler(CooperateEventType::APP_CLOSED, [this](Context &context, const CooperateEvent &event) {
126 this->OnAppClosed(context, event);
127 });
128 AddHandler(CooperateEventType::INPUT_HOTPLUG_EVENT, [this](Context &context, const CooperateEvent &event) {
129 this->OnHotplug(context, event);
130 });
131 AddHandler(CooperateEventType::DDM_BOARD_OFFLINE, [this](Context &context, const CooperateEvent &event) {
132 this->OnBoardOffline(context, event);
133 });
134 AddHandler(CooperateEventType::DDP_COOPERATE_SWITCH_CHANGED,
135 [this](Context &context, const CooperateEvent &event) {
136 this->OnSwitchChanged(context, event);
137 });
138 AddHandler(CooperateEventType::DSOFTBUS_SESSION_CLOSED,
139 [this](Context &context, const CooperateEvent &event) {
140 this->OnSoftbusSessionClosed(context, event);
141 });
142 AddHandler(CooperateEventType::DSOFTBUS_COME_BACK,
143 [this](Context &context, const CooperateEvent &event) {
144 this->OnComeBack(context, event);
145 });
146 AddHandler(CooperateEventType::DSOFTBUS_START_COOPERATE,
147 [this](Context &context, const CooperateEvent &event) {
148 this->OnRemoteStart(context, event);
149 });
150 AddHandler(CooperateEventType::DSOFTBUS_STOP_COOPERATE,
151 [this](Context &context, const CooperateEvent &event) {
152 this->OnRemoteStop(context, event);
153 });
154 AddHandler(CooperateEventType::DSOFTBUS_RELAY_COOPERATE,
155 [this](Context &context, const CooperateEvent &event) {
156 this->OnRelay(context, event);
157 });
158 AddHandler(CooperateEventType::DSOFTBUS_COOPERATE_WITH_OPTIONS,
159 [this](Context &context, const CooperateEvent &event) {
160 this->OnRemoteStartWithOptions(context, event);
161 });
162 AddHandler(CooperateEventType::DSOFTBUS_COME_BACK_WITH_OPTIONS,
163 [this](Context &context, const CooperateEvent &event) {
164 this->OnComeBackWithOptions(context, event);
165 });
166 AddHandler(CooperateEventType::DSOFTBUS_RELAY_COOPERATE_WITHOPTIONS,
167 [this](Context &context, const CooperateEvent &event) {
168 this->OnRelayWithOptions(context, event);
169 });
170 AddHandler(CooperateEventType::STOP_ABOUT_VIRTUALTRACKPAD,
171 [this](Context &context, const CooperateEvent &event) {
172 this->OnStopAboutVirtualTrackpad(context, event);
173 });
174 }
175
OnDisable(Context & context,const CooperateEvent & event)176 void CooperateOut::Initial::OnDisable(Context &context, const CooperateEvent &event)
177 {
178 FI_HILOGI("[disable cooperation] Stop cooperation");
179 parent_.StopCooperate(context, event);
180 }
181
OnStart(Context & context,const CooperateEvent & event)182 void CooperateOut::Initial::OnStart(Context &context, const CooperateEvent &event)
183 {
184 StartCooperateEvent param = std::get<StartCooperateEvent>(event.event);
185 CHKPV(parent_.env_);
186 if (parent_.env_->GetDragManager().GetDragState() == DragState::MOTION_DRAGGING) {
187 FI_HILOGE("Not allow cooperate");
188 NotAollowCooperateWhenMotionDragging result {
189 .pid = param.pid,
190 .userData = param.userData,
191 .networkId = param.remoteNetworkId,
192 .success = false,
193 .errCode = static_cast<int32_t>(CoordinationErrCode::NOT_AOLLOW_COOPERATE_WHEN_MOTION_DRAGGING)
194 };
195 context.eventMgr_.ErrorNotAollowCooperateWhenMotionDragging(result);
196 return;
197 }
198 context.eventMgr_.StartCooperate(param);
199 FI_HILOGI("[start] Start cooperation with \'%{public}s\', report success when out",
200 Utility::Anonymize(context.Peer()).c_str());
201 DSoftbusStartCooperateFinished failNotice {
202 .success = false,
203 .errCode = static_cast<int32_t>(CoordinationErrCode::UNEXPECTED_START_CALL)
204 };
205 context.eventMgr_.StartCooperateFinish(failNotice);
206 }
207
OnStartWithOptions(Context & context,const CooperateEvent & event)208 void CooperateOut::Initial::OnStartWithOptions(Context &context, const CooperateEvent &event)
209 {
210 StartWithOptionsEvent param = std::get<StartWithOptionsEvent>(event.event);
211 CHKPV(parent_.env_);
212 if (parent_.env_->GetDragManager().GetDragState() == DragState::MOTION_DRAGGING) {
213 FI_HILOGE("Not allow cooperate");
214 NotAollowCooperateWhenMotionDragging result {
215 .pid = param.pid,
216 .userData = param.userData,
217 .networkId = param.remoteNetworkId,
218 .success = false,
219 .errCode = static_cast<int32_t>(CoordinationErrCode::NOT_AOLLOW_COOPERATE_WHEN_MOTION_DRAGGING)
220 };
221 context.eventMgr_.ErrorNotAollowCooperateWhenMotionDragging(result);
222 return;
223 }
224 context.eventMgr_.StartCooperateWithOptions(param);
225 FI_HILOGI("[start] Start cooperation with Options\'%{public}s\', report success when out",
226 Utility::Anonymize(context.Peer()).c_str());
227 DSoftbusCooperateOptions failNotice {
228 .success = false,
229 .errCode = static_cast<int32_t>(CoordinationErrCode::UNEXPECTED_START_CALL)
230 };
231 context.eventMgr_.StartCooperateWithOptionsFinish(failNotice);
232 }
233
OnStop(Context & context,const CooperateEvent & event)234 void CooperateOut::Initial::OnStop(Context &context, const CooperateEvent &event)
235 {
236 StopCooperateEvent param = std::get<StopCooperateEvent>(event.event);
237
238 context.eventMgr_.StopCooperate(param);
239 FI_HILOGI("[stop] Stop cooperation with \'%{public}s\', unchain:%{public}d",
240 Utility::Anonymize(context.Peer()).c_str(), param.isUnchained);
241 parent_.StopCooperate(context, event);
242
243 param.networkId = context.Peer();
244 DSoftbusStopCooperateFinished notice {
245 .networkId = context.Peer(),
246 .normal = true,
247 };
248 context.eventMgr_.StopCooperateFinish(notice);
249
250 parent_.UnchainConnections(context, param);
251 }
252
OnComeBack(Context & context,const CooperateEvent & event)253 void CooperateOut::Initial::OnComeBack(Context &context, const CooperateEvent &event)
254 {
255 CALL_INFO_TRACE;
256 DSoftbusComeBack notice = std::get<DSoftbusComeBack>(event.event);
257
258 if (!context.IsPeer(notice.networkId)) {
259 return;
260 }
261 FI_HILOGI("[come back] From \'%{public}s\'", Utility::Anonymize(notice.networkId).c_str());
262 context.OnRemoteStartCooperate(notice.extra);
263 DSoftbusStartCooperate startEvent {
264 .networkId = notice.networkId,
265 };
266 context.eventMgr_.RemoteStart(startEvent);
267 context.inputEventInterceptor_.Disable();
268
269 context.RemoteStartSuccess(notice);
270 context.eventMgr_.RemoteStartFinish(notice);
271 TransiteTo(context, CooperateState::COOPERATE_STATE_FREE);
272 context.OnBack();
273 if (!context.NeedHideCursor()) {
274 parent_.SimulateShowPointerEvent();
275 }
276 }
277
OnComeBackWithOptions(Context & context,const CooperateEvent & event)278 void CooperateOut::Initial::OnComeBackWithOptions(Context &context, const CooperateEvent &event)
279 {
280 CALL_INFO_TRACE;
281 DSoftbusCooperateOptions notice = std::get<DSoftbusCooperateOptions>(event.event);
282
283 if (!context.IsPeer(notice.networkId)) {
284 return;
285 }
286 FI_HILOGI("[come back cooperate with options] From \'%{public}s\'", Utility::Anonymize(notice.networkId).c_str());
287 context.OnRemoteStartCooperate(notice.extra);
288 DSoftbusStartCooperate startEvent{
289 .networkId = notice.networkId,
290 };
291 context.eventMgr_.RemoteStart(startEvent);
292 context.inputEventInterceptor_.Disable();
293
294 context.OnRemoteStart(notice);
295 context.eventMgr_.RemoteStartWithOptionsFinish(notice);
296 TransiteTo(context, CooperateState::COOPERATE_STATE_FREE);
297 context.OnBack();
298 if (!context.NeedHideCursor()) {
299 parent_.SimulateShowPointerEvent();
300 }
301 }
302
OnRemoteStart(Context & context,const CooperateEvent & event)303 void CooperateOut::Initial::OnRemoteStart(Context &context, const CooperateEvent &event)
304 {
305 DSoftbusStartCooperate notice = std::get<DSoftbusStartCooperate>(event.event);
306
307 if (context.IsLocal(notice.networkId)) {
308 return;
309 }
310 FI_HILOGI("[remote start] Request from \'%{public}s\'", Utility::Anonymize(notice.networkId).c_str());
311 if (context.IsPeer(notice.networkId)) {
312 FI_HILOGI("[remote start] Reset on request from peer");
313 parent_.StopCooperate(context, event);
314 return;
315 }
316 context.OnResetCooperation();
317 context.OnRemoteStartCooperate(notice.extra);
318 context.eventMgr_.RemoteStart(notice);
319 context.inputEventInterceptor_.Disable();
320
321 DSoftbusStopCooperate stopNotice {};
322 context.dsoftbus_.StopCooperate(context.Peer(), stopNotice);
323
324 context.RemoteStartSuccess(notice);
325 context.inputEventBuilder_.Enable(context);
326 context.eventMgr_.RemoteStartFinish(notice);
327 FI_HILOGI("[remote start] Cooperation with \'%{public}s\' established", Utility::Anonymize(context.Peer()).c_str());
328 TransiteTo(context, CooperateState::COOPERATE_STATE_IN);
329 context.OnTransitionIn();
330 }
331
OnRemoteStartWithOptions(Context & context,const CooperateEvent & event)332 void CooperateOut::Initial::OnRemoteStartWithOptions(Context &context, const CooperateEvent &event)
333 {
334 DSoftbusCooperateOptions notice = std::get<DSoftbusCooperateOptions>(event.event);
335 if (context.IsLocal(notice.networkId)) {
336 return;
337 }
338 FI_HILOGI("[remote start cooperate with options ] Request from '%{public}s'",
339 Utility::Anonymize(notice.networkId).c_str());
340 if (context.IsPeer(notice.networkId)) {
341 FI_HILOGI("[remote start] Reset on request from peer");
342 parent_.StopCooperate(context, event);
343 return;
344 }
345 context.OnResetCooperation();
346 context.OnRemoteStartCooperate(notice.extra);
347 context.eventMgr_.RemoteStartWithOptions(notice);
348 context.inputEventInterceptor_.Disable();
349
350 DSoftbusStopCooperate stopNotice{};
351 context.dsoftbus_.StopCooperate(context.Peer(), stopNotice);
352
353 context.OnRemoteStart(notice);
354 context.inputEventBuilder_.Enable(context);
355 context.eventMgr_.RemoteStartWithOptionsFinish(notice);
356 FI_HILOGI("[remote start] Cooperation with \'%{public}s\' established", Utility::Anonymize(context.Peer()).c_str());
357 TransiteTo(context, CooperateState::COOPERATE_STATE_IN);
358 context.OnTransitionIn();
359 }
360
OnRemoteStop(Context & context,const CooperateEvent & event)361 void CooperateOut::Initial::OnRemoteStop(Context &context, const CooperateEvent &event)
362 {
363 DSoftbusStopCooperate notice = std::get<DSoftbusStopCooperate>(event.event);
364
365 if (!context.IsPeer(notice.networkId)) {
366 return;
367 }
368 FI_HILOGI("[remote stop] Notification from \'%{public}s\'", Utility::Anonymize(notice.networkId).c_str());
369 context.eventMgr_.RemoteStop(notice);
370 context.inputEventInterceptor_.Disable();
371 context.ResetCursorPosition();
372 context.eventMgr_.RemoteStopFinish(notice);
373 TransiteTo(context, CooperateState::COOPERATE_STATE_FREE);
374 context.OnResetCooperation();
375 }
376
OnRelay(Context & context,const CooperateEvent & event)377 void CooperateOut::Initial::OnRelay(Context &context, const CooperateEvent &event)
378 {
379 DSoftbusRelayCooperate notice = std::get<DSoftbusRelayCooperate>(event.event);
380 if (!context.IsPeer(notice.networkId)) {
381 return;
382 }
383 DSoftbusRelayCooperateFinished resp {
384 .targetNetworkId = notice.targetNetworkId,
385 .uid = notice.uid,
386 };
387
388 int32_t ret = context.dsoftbus_.OpenSession(notice.targetNetworkId);
389 if (ret != RET_OK) {
390 FI_HILOGE("[relay cooperate] Failed to connect to \'%{public}s\'",
391 Utility::Anonymize(notice.targetNetworkId).c_str());
392 resp.normal = false;
393 context.dsoftbus_.RelayCooperateFinish(notice.networkId, resp);
394 return;
395 }
396
397 resp.normal = true;
398 context.dsoftbus_.RelayCooperateFinish(notice.networkId, resp);
399
400 context.RelayCooperate(notice);
401 context.inputEventInterceptor_.Update(context);
402 FI_HILOGI("[relay cooperate] Relay cooperation to \'%{public}s\'", Utility::Anonymize(context.Peer()).c_str());
403 context.OnRelayCooperation(context.Peer(), context.NormalizedCursorPosition());
404 }
405
OnRelayWithOptions(Context & context,const CooperateEvent & event)406 void CooperateOut::Initial::OnRelayWithOptions(Context &context, const CooperateEvent &event)
407 {
408 DSoftbusRelayCooperate notice = std::get<DSoftbusRelayCooperate>(event.event);
409 if (!context.IsPeer(notice.networkId)) {
410 return;
411 }
412 DSoftbusRelayCooperateFinished resp {
413 .targetNetworkId = notice.targetNetworkId,
414 .uid = notice.uid,
415 };
416
417 int32_t ret = context.dsoftbus_.OpenSession(notice.targetNetworkId);
418 if (ret != RET_OK) {
419 FI_HILOGE("[relay cooperate] Failed to connect to \'%{public}s\'",
420 Utility::Anonymize(notice.targetNetworkId).c_str());
421 resp.normal = false;
422 context.dsoftbus_.RelayCooperateWithOptionsFinish(notice.networkId, resp);
423 return;
424 }
425
426 resp.normal = true;
427 context.dsoftbus_.RelayCooperateWithOptionsFinish(notice.networkId, resp);
428
429 context.RelayCooperate(notice);
430 context.inputEventInterceptor_.Update(context);
431 FI_HILOGI("[relay cooperate] Relay cooperation to \'%{public}s\'", Utility::Anonymize(context.Peer()).c_str());
432 context.OnRelayCooperation(context.Peer(), context.NormalizedCursorPosition());
433 }
434
OnHotplug(Context & context,const CooperateEvent & event)435 void CooperateOut::Initial::OnHotplug(Context &context, const CooperateEvent &event)
436 {
437 InputHotplugEvent notice = std::get<InputHotplugEvent>(event.event);
438 if (context.GetVirtualTrackpadDeviceId() > 0) {
439 return;
440 } else if ((context.GetVirtualTrackpadDeviceId() <= 0) &&
441 !(parent_.env_->GetDeviceManager().HasLocalPointerDevice())) {
442 FI_HILOGI("Cur device not exist pointer device");
443 parent_.StopCooperate(context, event);
444 } else if (notice.deviceId != context.StartDeviceId()) {
445 return;
446 }
447 FI_HILOGI("Stop cooperation on unplug of dedicated pointer");
448 parent_.StopCooperate(context, event);
449 }
450
OnAppClosed(Context & context,const CooperateEvent & event)451 void CooperateOut::Initial::OnAppClosed(Context &context, const CooperateEvent &event)
452 {
453 FI_HILOGI("[app closed] Close all connections");
454 context.dsoftbus_.CloseAllSessions();
455 FI_HILOGI("[app closed] Stop cooperation");
456 parent_.StopCooperate(context, event);
457 }
458
OnBoardOffline(Context & context,const CooperateEvent & event)459 void CooperateOut::Initial::OnBoardOffline(Context &context, const CooperateEvent &event)
460 {
461 DDMBoardOfflineEvent notice = std::get<DDMBoardOfflineEvent>(event.event);
462
463 if (!context.IsPeer(notice.networkId)) {
464 return;
465 }
466 FI_HILOGI("[board offline] Peer(\'%{public}s\') is offline", Utility::Anonymize(notice.networkId).c_str());
467 parent_.StopCooperate(context, event);
468 }
469
OnSwitchChanged(Context & context,const CooperateEvent & event)470 void CooperateOut::Initial::OnSwitchChanged(Context &context, const CooperateEvent &event)
471 {
472 DDPCooperateSwitchChanged notice = std::get<DDPCooperateSwitchChanged>(event.event);
473
474 if (!context.IsPeer(notice.networkId) || notice.normal) {
475 return;
476 }
477 FI_HILOGI("[switch off] Peer(\'%{public}s\') switch off", Utility::Anonymize(notice.networkId).c_str());
478 parent_.StopCooperate(context, event);
479 }
480
OnSoftbusSessionClosed(Context & context,const CooperateEvent & event)481 void CooperateOut::Initial::OnSoftbusSessionClosed(Context &context, const CooperateEvent &event)
482 {
483 DSoftbusSessionClosed notice = std::get<DSoftbusSessionClosed>(event.event);
484
485 if (!context.IsPeer(notice.networkId)) {
486 return;
487 }
488 FI_HILOGI("[dsoftbus session closed] Disconnected with \'%{public}s\'",
489 Utility::Anonymize(notice.networkId).c_str());
490 parent_.StopCooperate(context, event);
491 }
492
OnStopAboutVirtualTrackpad(Context & context,const CooperateEvent & event)493 void CooperateOut::Initial::OnStopAboutVirtualTrackpad(Context &context, const CooperateEvent &event)
494 {
495 CALL_INFO_TRACE;
496 CHKPV(parent_.env_);
497 bool hasLocalPointerDevice = parent_.env_->GetDeviceManager().HasLocalPointerDevice();
498 if (!hasLocalPointerDevice) {
499 parent_.StopCooperate(context, event);
500 }
501 }
502
OnProgress(Context & context,const CooperateEvent & event)503 void CooperateOut::Initial::OnProgress(Context &context, const CooperateEvent &event)
504 {}
505
OnProgressWithOptions(Context & context,const CooperateEvent & event)506 void CooperateOut::Initial::OnProgressWithOptions(Context &context, const CooperateEvent &event)
507 {}
508
OnReset(Context & context,const CooperateEvent & event)509 void CooperateOut::Initial::OnReset(Context &context, const CooperateEvent &event)
510 {}
511
StopCooperate(Context & context,const CooperateEvent & event)512 void CooperateOut::StopCooperate(Context &context, const CooperateEvent &event)
513 {
514 context.inputEventInterceptor_.Disable();
515
516 DSoftbusStopCooperate notice {};
517 context.dsoftbus_.StopCooperate(context.Peer(), notice);
518
519 context.ResetCursorPosition();
520 TransiteTo(context, CooperateState::COOPERATE_STATE_FREE);
521 context.OnResetCooperation();
522 }
523
UnchainConnections(Context & context,const StopCooperateEvent & event) const524 void CooperateOut::UnchainConnections(Context &context, const StopCooperateEvent &event) const
525 {
526 if (event.isUnchained) {
527 FI_HILOGI("Unchain all connections");
528 context.dsoftbus_.CloseAllSessions();
529 context.eventMgr_.OnUnchain(event);
530 }
531 }
532 } // namespace Cooperate
533 } // namespace DeviceStatus
534 } // namespace Msdp
535 } // namespace OHOS
536