• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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