1 /*
2  * Copyright (c) 2023-2024 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 "state_machine.h"
17 
18 #include "application_state_observer_stub.h"
19 #include "iservice_registry.h"
20 #include "system_ability_definition.h"
21 
22 #include "common_event_observer.h"
23 #include "cooperate_events.h"
24 #include "cooperate_free.h"
25 #include "cooperate_hisysevent.h"
26 #include "cooperate_in.h"
27 #include "cooperate_out.h"
28 #include "devicestatus_define.h"
29 #include "devicestatus_errors.h"
30 #include "event_manager.h"
31 #include "utility.h"
32 
33 #undef LOG_TAG
34 #define LOG_TAG "StateMachine"
35 
36 namespace OHOS {
37 namespace Msdp {
38 namespace DeviceStatus {
39 namespace Cooperate {
40 
AppStateObserver(Channel<CooperateEvent>::Sender sender,int32_t clientPid)41 StateMachine::AppStateObserver::AppStateObserver(Channel<CooperateEvent>::Sender sender, int32_t clientPid)
42     : sender_(sender), clientPid_(clientPid) {}
43 
OnProcessDied(const AppExecFwk::ProcessData & processData)44 void StateMachine::AppStateObserver::OnProcessDied(const AppExecFwk::ProcessData &processData)
45 {
46     FI_HILOGI("\'%{public}s\' died, pid:%{public}d", processData.bundleName.c_str(), processData.pid);
47     if (processData.pid == clientPid_) {
48         auto ret = sender_.Send(CooperateEvent(
49             CooperateEventType::APP_CLOSED,
50             ClientDiedEvent {
51                 .pid = clientPid_,
52             }));
53         if (ret != Channel<CooperateEvent>::NO_ERROR) {
54             FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
55         }
56         FI_HILOGI("Report to handler");
57     }
58 }
59 
UpdateClientPid(int32_t clientPid)60 void StateMachine::AppStateObserver::UpdateClientPid(int32_t clientPid)
61 {
62     clientPid_ = clientPid;
63 }
64 
StateMachine(IContext * env)65 StateMachine::StateMachine(IContext *env)
66     : env_(env)
67 {
68     states_[COOPERATE_STATE_FREE] = std::make_shared<CooperateFree>(*this, env);
69     states_[COOPERATE_STATE_OUT] = std::make_shared<CooperateOut>(*this, env);
70     states_[COOPERATE_STATE_IN] = std::make_shared<CooperateIn>(*this, env);
71 
72     AddHandler(CooperateEventType::ADD_OBSERVER, [this](Context &context, const CooperateEvent &event) {
73         this->AddObserver(context, event);
74     });
75     AddHandler(CooperateEventType::REMOVE_OBSERVER, [this](Context &context, const CooperateEvent &event) {
76         this->RemoveObserver(context, event);
77     });
78     AddHandler(CooperateEventType::REGISTER_LISTENER, [this](Context &context, const CooperateEvent &event) {
79         this->RegisterListener(context, event);
80     });
81     AddHandler(CooperateEventType::UNREGISTER_LISTENER, [this](Context &context, const CooperateEvent &event) {
82         this->UnregisterListener(context, event);
83     });
84     AddHandler(CooperateEventType::REGISTER_HOTAREA_LISTENER, [this](Context &context, const CooperateEvent &event) {
85         this->RegisterHotAreaListener(context, event);
86     });
87     AddHandler(CooperateEventType::UNREGISTER_HOTAREA_LISTENER,
88         [this](Context &context, const CooperateEvent &event) {
89             this->UnregisterHotAreaListener(context, event);
90     });
91     AddHandler(CooperateEventType::ENABLE, [this](Context &context, const CooperateEvent &event) {
92         this->EnableCooperate(context, event);
93     });
94     AddHandler(CooperateEventType::DISABLE, [this](Context &context, const CooperateEvent &event) {
95         this->DisableCooperate(context, event);
96     });
97     AddHandler(CooperateEventType::START, [this](Context &context, const CooperateEvent &event) {
98         this->StartCooperate(context, event);
99     });
100     AddHandler(CooperateEventType::GET_COOPERATE_STATE, [this](Context &context, const CooperateEvent &event) {
101         this->GetCooperateState(context, event);
102     });
103     AddHandler(CooperateEventType::REGISTER_EVENT_LISTENER,
104         [this](Context &context, const CooperateEvent &event) {
105             this->RegisterEventListener(context, event);
106     });
107     AddHandler(CooperateEventType::UNREGISTER_EVENT_LISTENER,
108         [this](Context &context, const CooperateEvent &event) {
109             this->UnregisterEventListener(context, event);
110     });
111     AddHandler(CooperateEventType::DDM_BOARD_ONLINE,
112         [this](Context &context, const CooperateEvent &event) {
113             this->OnBoardOnline(context, event);
114     });
115     AddHandler(CooperateEventType::DDM_BOARD_OFFLINE,
116         [this](Context &context, const CooperateEvent &event) {
117             this->OnBoardOffline(context, event);
118     });
119     AddHandler(CooperateEventType::DDP_COOPERATE_SWITCH_CHANGED,
120         [this](Context &context, const CooperateEvent &event) {
121             this->OnProfileChanged(context, event);
122     });
123     AddHandler(CooperateEventType::INPUT_POINTER_EVENT,
124         [this](Context &context, const CooperateEvent &event) {
125             this->OnPointerEvent(context, event);
126     });
127     AddHandler(CooperateEventType::APP_CLOSED, [this](Context &context, const CooperateEvent &event) {
128         this->OnProcessClientDied(context, event);
129     });
130     AddHandler(CooperateEventType::DSOFTBUS_SESSION_OPENED,
131         [this](Context &context, const CooperateEvent &event) {
132             this->OnSoftbusSessionOpened(context, event);
133     });
134     AddHandler(CooperateEventType::DSOFTBUS_SESSION_CLOSED,
135         [this](Context &context, const CooperateEvent &event) {
136             this->OnSoftbusSessionClosed(context, event);
137     });
138     AddHandler(CooperateEventType::DSOFTBUS_SUBSCRIBE_MOUSE_LOCATION,
139         [this](Context &context, const CooperateEvent &event) {
140             this->OnSoftbusSubscribeMouseLocation(context, event);
141     });
142     AddHandler(CooperateEventType::DSOFTBUS_UNSUBSCRIBE_MOUSE_LOCATION,
143         [this](Context &context, const CooperateEvent &event) {
144             this->OnSoftbusUnSubscribeMouseLocation(context, event);
145     });
146     AddHandler(CooperateEventType::DSOFTBUS_REPLY_SUBSCRIBE_MOUSE_LOCATION,
147         [this](Context &context, const CooperateEvent &event) {
148             this->OnSoftbusReplySubscribeMouseLocation(context, event);
149     });
150     AddHandler(CooperateEventType::DSOFTBUS_REPLY_UNSUBSCRIBE_MOUSE_LOCATION,
151         [this](Context &context, const CooperateEvent &event) {
152             this->OnSoftbusReplyUnSubscribeMouseLocation(context, event);
153     });
154     AddHandler(CooperateEventType::DSOFTBUS_MOUSE_LOCATION,
155         [this](Context &context, const CooperateEvent &event) {
156             this->OnSoftbusMouseLocation(context, event);
157     });
158     AddHandler(CooperateEventType::DSOFTBUS_START_COOPERATE,
159         [this](Context &context, const CooperateEvent &event) {
160             this->OnRemoteStart(context, event);
161     });
162     AddHandler(CooperateEventType::INPUT_HOTPLUG_EVENT,
163         [this](Context &context, const CooperateEvent &event) {
164             this->OnHotPlugEvent(context, event);
165     });
166     AddHandler(CooperateEventType::DSOFTBUS_INPUT_DEV_HOT_PLUG,
167         [this](Context &context, const CooperateEvent &event) {
168             this->OnRemoteHotPlug(context, event);
169     });
170     AddHandler(CooperateEventType::DSOFTBUS_INPUT_DEV_SYNC,
171         [this](Context &context, const CooperateEvent &event) {
172             this->OnRemoteInputDevice(context, event);
173     });
174 }
175 
OnEvent(Context & context,const CooperateEvent & event)176 void StateMachine::OnEvent(Context &context, const CooperateEvent &event)
177 {
178     if (auto iter = handlers_.find(event.type); iter != handlers_.end()) {
179         iter->second(context, event);
180     } else {
181         Transfer(context, event);
182     }
183 }
184 
TransiteTo(Context & context,CooperateState state)185 void StateMachine::TransiteTo(Context &context, CooperateState state)
186 {
187     if ((state >= COOPERATE_STATE_FREE) &&
188         (state < N_COOPERATE_STATES) &&
189         (state != current_)) {
190         states_[current_]->OnLeaveState(context);
191         current_ = state;
192         states_[current_]->OnEnterState(context);
193         auto curState = static_cast<OHOS::Msdp::DeviceStatus::CooperateState>(state);
194         CooperateDFX::WriteCooperateState(curState);
195     }
196 }
197 
AddHandler(CooperateEventType event,std::function<void (Context &,const CooperateEvent &)> handler)198 void StateMachine::AddHandler(CooperateEventType event, std::function<void(Context&, const CooperateEvent&)> handler)
199 {
200     handlers_.emplace(event, handler);
201 }
202 
OnQuit(Context & context)203 void StateMachine::OnQuit(Context &context)
204 {
205     CALL_DEBUG_ENTER;
206     RemoveWatches(context);
207     RemoveMonitor(context);
208 }
209 
AddObserver(Context & context,const CooperateEvent & event)210 void StateMachine::AddObserver(Context &context, const CooperateEvent &event)
211 {
212     AddObserverEvent notice = std::get<AddObserverEvent>(event.event);
213     context.AddObserver(notice.observer);
214 }
215 
RemoveObserver(Context & context,const CooperateEvent & event)216 void StateMachine::RemoveObserver(Context &context, const CooperateEvent &event)
217 {
218     RemoveObserverEvent notice = std::get<RemoveObserverEvent>(event.event);
219     context.RemoveObserver(notice.observer);
220 }
221 
RegisterListener(Context & context,const CooperateEvent & event)222 void StateMachine::RegisterListener(Context &context, const CooperateEvent &event)
223 {
224     RegisterListenerEvent notice = std::get<RegisterListenerEvent>(event.event);
225     context.eventMgr_.RegisterListener(notice);
226 }
227 
UnregisterListener(Context & context,const CooperateEvent & event)228 void StateMachine::UnregisterListener(Context &context, const CooperateEvent &event)
229 {
230     UnregisterListenerEvent notice = std::get<UnregisterListenerEvent>(event.event);
231     context.eventMgr_.UnregisterListener(notice);
232 }
233 
RegisterHotAreaListener(Context & context,const CooperateEvent & event)234 void StateMachine::RegisterHotAreaListener(Context &context, const CooperateEvent &event)
235 {
236     RegisterHotareaListenerEvent notice = std::get<RegisterHotareaListenerEvent>(event.event);
237     context.hotArea_.AddListener(notice);
238 }
239 
UnregisterHotAreaListener(Context & context,const CooperateEvent & event)240 void StateMachine::UnregisterHotAreaListener(Context &context, const CooperateEvent &event)
241 {
242     UnregisterHotareaListenerEvent notice = std::get<UnregisterHotareaListenerEvent>(event.event);
243     context.hotArea_.RemoveListener(notice);
244 }
245 
EnableCooperate(Context & context,const CooperateEvent & event)246 void StateMachine::EnableCooperate(Context &context, const CooperateEvent &event)
247 {
248     CALL_INFO_TRACE;
249     EnableCooperateEvent enableEvent = std::get<EnableCooperateEvent>(event.event);
250     context.EnableCooperate(enableEvent);
251     context.eventMgr_.EnableCooperate(enableEvent);
252     context.hotArea_.EnableCooperate(enableEvent);
253     observer_ = CommonEventObserver::CreateCommonEventObserver(
254         [&context, this] (const std::string &commonEvent) {
255             OnCommonEvent(context, commonEvent);
256         }
257     );
258     context.commonEvent_.AddObserver(observer_);
259     AddSessionObserver(context, enableEvent);
260     AddMonitor(context);
261     Transfer(context, event);
262 }
263 
DisableCooperate(Context & context,const CooperateEvent & event)264 void StateMachine::DisableCooperate(Context &context, const CooperateEvent &event)
265 {
266     CALL_INFO_TRACE;
267     DisableCooperateEvent disableEvent = std::get<DisableCooperateEvent>(event.event);
268     context.DisableCooperate(disableEvent);
269     context.eventMgr_.DisableCooperate(disableEvent);
270     context.commonEvent_.RemoveObserver(observer_);
271     RemoveSessionObserver(context, disableEvent);
272     RemoveMonitor(context);
273     Transfer(context, event);
274 }
275 
StartCooperate(Context & context,const CooperateEvent & event)276 void StateMachine::StartCooperate(Context &context, const CooperateEvent &event)
277 {
278     CALL_INFO_TRACE;
279     StartCooperateEvent startEvent = std::get<StartCooperateEvent>(event.event);
280     if (!context.ddm_.CheckSameAccountToLocal(startEvent.remoteNetworkId)) {
281         FI_HILOGE("CheckSameAccountToLocal failed");
282         startEvent.errCode->set_value(COMMON_PERMISSION_CHECK_ERROR);
283         return;
284     }
285     UpdateApplicationStateObserver(startEvent.pid);
286     if (!context.IsAllowCooperate()) {
287         FI_HILOGI("Not allow cooperate");
288         startEvent.errCode->set_value(COMMON_NOT_ALLOWED_DISTRIBUTED);
289         return;
290     }
291     startEvent.errCode->set_value(RET_OK);
292     Transfer(context, event);
293 }
294 
GetCooperateState(Context & context,const CooperateEvent & event)295 void StateMachine::GetCooperateState(Context &context, const CooperateEvent &event)
296 {
297     CALL_INFO_TRACE;
298     GetCooperateStateEvent stateEvent = std::get<GetCooperateStateEvent>(event.event);
299     UpdateApplicationStateObserver(stateEvent.pid);
300     bool switchStatus { false };
301     EventManager::CooperateStateNotice notice {
302         .pid = stateEvent.pid,
303         .msgId = MessageId::COORDINATION_GET_STATE,
304         .userData = stateEvent.userData,
305         .state = switchStatus,
306     };
307     context.eventMgr_.GetCooperateState(notice);
308 }
309 
OnProcessClientDied(Context & context,const CooperateEvent & event)310 void StateMachine::OnProcessClientDied(Context &context, const CooperateEvent &event)
311 {
312     CALL_INFO_TRACE;
313     ClientDiedEvent notice = std::get<ClientDiedEvent>(event.event);
314     context.eventMgr_.OnClientDied(notice);
315     context.hotArea_.OnClientDied(notice);
316     context.mouseLocation_.OnClientDied(notice);
317     Transfer(context, event);
318 }
319 
RegisterEventListener(Context & context,const CooperateEvent & event)320 void StateMachine::RegisterEventListener(Context &context, const CooperateEvent &event)
321 {
322     RegisterEventListenerEvent notice = std::get<RegisterEventListenerEvent>(event.event);
323     context.mouseLocation_.AddListener(notice);
324 }
325 
UnregisterEventListener(Context & context,const CooperateEvent & event)326 void StateMachine::UnregisterEventListener(Context &context, const CooperateEvent &event)
327 {
328     UnregisterEventListenerEvent notice = std::get<UnregisterEventListenerEvent>(event.event);
329     context.mouseLocation_.RemoveListener(notice);
330 }
331 
OnBoardOnline(Context & context,const CooperateEvent & event)332 void StateMachine::OnBoardOnline(Context &context, const CooperateEvent &event)
333 {
334     CALL_INFO_TRACE;
335     DDMBoardOnlineEvent onlineEvent = std::get<DDMBoardOnlineEvent>(event.event);
336 
337     auto ret = onlineBoards_.insert(onlineEvent.networkId);
338     if (ret.second) {
339         FI_HILOGD("Watch \'%{public}s\'", Utility::Anonymize(onlineEvent.networkId).c_str());
340         Transfer(context, event);
341     }
342 }
343 
OnBoardOffline(Context & context,const CooperateEvent & event)344 void StateMachine::OnBoardOffline(Context &context, const CooperateEvent &event)
345 {
346     CALL_INFO_TRACE;
347     DDMBoardOfflineEvent offlineEvent = std::get<DDMBoardOfflineEvent>(event.event);
348 
349     if (auto iter = onlineBoards_.find(offlineEvent.networkId); iter != onlineBoards_.end()) {
350         onlineBoards_.erase(iter);
351         FI_HILOGD("Remove watch \'%{public}s\'", Utility::Anonymize(offlineEvent.networkId).c_str());
352         context.CloseDistributedFileConnection(offlineEvent.networkId);
353         Transfer(context, event);
354     }
355 }
356 
OnProfileChanged(Context & context,const CooperateEvent & event)357 void StateMachine::OnProfileChanged(Context &context, const CooperateEvent &event)
358 {
359     CALL_INFO_TRACE;
360     DDPCooperateSwitchChanged notice = std::get<DDPCooperateSwitchChanged>(event.event);
361     context.eventMgr_.OnProfileChanged(notice);
362     Transfer(context, event);
363 }
364 
OnPointerEvent(Context & context,const CooperateEvent & event)365 void StateMachine::OnPointerEvent(Context &context, const CooperateEvent &event)
366 {
367     CALL_DEBUG_ENTER;
368     InputPointerEvent pointerEvent = std::get<InputPointerEvent>(event.event);
369     Coordinate cursorPos = context.CursorPosition();
370     context.OnPointerEvent(pointerEvent);
371     pointerEvent.position = cursorPos;
372     Transfer(context, CooperateEvent { CooperateEventType::INPUT_POINTER_EVENT, pointerEvent });
373 }
374 
OnSoftbusSessionClosed(Context & context,const CooperateEvent & event)375 void StateMachine::OnSoftbusSessionClosed(Context &context, const CooperateEvent &event)
376 {
377     CALL_INFO_TRACE;
378     DSoftbusSessionClosed notice = std::get<DSoftbusSessionClosed>(event.event);
379     context.eventMgr_.OnSoftbusSessionClosed(notice);
380     context.inputDevMgr_.OnSoftbusSessionClosed(notice);
381     context.CloseDistributedFileConnection(notice.networkId);
382     Transfer(context, event);
383 }
384 
OnSoftbusSessionOpened(Context & context,const CooperateEvent & event)385 void StateMachine::OnSoftbusSessionOpened(Context &context, const CooperateEvent &event)
386 {
387     CALL_INFO_TRACE;
388     DSoftbusSessionOpened notice = std::get<DSoftbusSessionOpened>(event.event);
389     context.inputDevMgr_.OnSoftbusSessionOpened(notice);
390     Transfer(context, event);
391 }
392 
OnHotPlugEvent(Context & context,const CooperateEvent & event)393 void StateMachine::OnHotPlugEvent(Context &context, const CooperateEvent &event)
394 {
395     CALL_INFO_TRACE;
396     InputHotplugEvent notice = std::get<InputHotplugEvent>(event.event);
397     context.inputDevMgr_.OnLocalHotPlug(notice);
398     Transfer(context, event);
399 }
400 
OnRemoteInputDevice(Context & context,const CooperateEvent & event)401 void StateMachine::OnRemoteInputDevice(Context &context, const CooperateEvent &event)
402 {
403     CALL_INFO_TRACE;
404     DSoftbusSyncInputDevice notice = std::get<DSoftbusSyncInputDevice>(event.event);
405     context.inputDevMgr_.OnRemoteInputDevice(notice);
406     Transfer(context, event);
407 }
408 
OnRemoteHotPlug(Context & context,const CooperateEvent & event)409 void StateMachine::OnRemoteHotPlug(Context &context, const CooperateEvent &event)
410 {
411     CALL_INFO_TRACE;
412     DSoftbusHotPlugEvent notice = std::get<DSoftbusHotPlugEvent>(event.event);
413     context.inputDevMgr_.OnRemoteHotPlug(notice);
414     Transfer(context, event);
415 }
416 
OnSoftbusSubscribeMouseLocation(Context & context,const CooperateEvent & event)417 void StateMachine::OnSoftbusSubscribeMouseLocation(Context &context, const CooperateEvent &event)
418 {
419     CALL_INFO_TRACE;
420     DSoftbusSubscribeMouseLocation notice = std::get<DSoftbusSubscribeMouseLocation>(event.event);
421     context.mouseLocation_.OnSubscribeMouseLocation(notice);
422 }
423 
OnSoftbusUnSubscribeMouseLocation(Context & context,const CooperateEvent & event)424 void StateMachine::OnSoftbusUnSubscribeMouseLocation(Context &context, const CooperateEvent &event)
425 {
426     CALL_INFO_TRACE;
427     DSoftbusUnSubscribeMouseLocation notice = std::get<DSoftbusUnSubscribeMouseLocation>(event.event);
428     context.mouseLocation_.OnUnSubscribeMouseLocation(notice);
429 }
430 
OnSoftbusReplySubscribeMouseLocation(Context & context,const CooperateEvent & event)431 void StateMachine::OnSoftbusReplySubscribeMouseLocation(Context &context, const CooperateEvent &event)
432 {
433     CALL_INFO_TRACE;
434     DSoftbusReplySubscribeMouseLocation notice = std::get<DSoftbusReplySubscribeMouseLocation>(event.event);
435     context.mouseLocation_.OnReplySubscribeMouseLocation(notice);
436 }
437 
OnSoftbusReplyUnSubscribeMouseLocation(Context & context,const CooperateEvent & event)438 void StateMachine::OnSoftbusReplyUnSubscribeMouseLocation(Context &context, const CooperateEvent &event)
439 {
440     CALL_INFO_TRACE;
441     DSoftbusReplyUnSubscribeMouseLocation notice = std::get<DSoftbusReplyUnSubscribeMouseLocation>(event.event);
442     context.mouseLocation_.OnReplyUnSubscribeMouseLocation(notice);
443 }
444 
OnSoftbusMouseLocation(Context & context,const CooperateEvent & event)445 void StateMachine::OnSoftbusMouseLocation(Context &context, const CooperateEvent &event)
446 {
447     CALL_DEBUG_ENTER;
448     DSoftbusSyncMouseLocation notice = std::get<DSoftbusSyncMouseLocation>(event.event);
449     context.mouseLocation_.OnRemoteMouseLocation(notice);
450 }
451 
OnRemoteStart(Context & context,const CooperateEvent & event)452 void StateMachine::OnRemoteStart(Context &context, const CooperateEvent &event)
453 {
454     DSoftbusStartCooperate startEvent = std::get<DSoftbusStartCooperate>(event.event);
455     if (!context.ddm_.CheckSameAccountToLocal(startEvent.originNetworkId)) {
456         FI_HILOGE("CheckSameAccountToLocal failed, unchain link");
457         CooperateEvent stopEvent(
458             CooperateEventType::STOP,
459             StopCooperateEvent{
460                 .isUnchained = true
461             }
462         );
463         Transfer(context, stopEvent);
464         return;
465     }
466     Transfer(context, event);
467 }
468 
Transfer(Context & context,const CooperateEvent & event)469 void StateMachine::Transfer(Context &context, const CooperateEvent &event)
470 {
471     states_[current_]->OnEvent(context, event);
472 }
473 
GetAppMgr()474 sptr<AppExecFwk::IAppMgr> StateMachine::GetAppMgr()
475 {
476     CALL_INFO_TRACE;
477     auto saMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
478     CHKPP(saMgr);
479     auto appMgrObj = saMgr->GetSystemAbility(APP_MGR_SERVICE_ID);
480     CHKPP(appMgrObj);
481     return iface_cast<AppExecFwk::IAppMgr>(appMgrObj);
482 }
483 
RegisterApplicationStateObserver(Channel<CooperateEvent>::Sender sender,const EnableCooperateEvent & event)484 int32_t StateMachine::RegisterApplicationStateObserver(Channel<CooperateEvent>::Sender sender,
485     const EnableCooperateEvent &event)
486 {
487     CALL_INFO_TRACE;
488     auto bundleName = GetPackageName(event.tokenId);
489     clientBundleNames_.push_back(bundleName);
490     FI_HILOGI("Register application %{public}s state observer", bundleName.c_str());
491     auto appMgr = GetAppMgr();
492     CHKPR(appMgr, RET_ERR);
493     appStateObserver_ = sptr<AppStateObserver>::MakeSptr(sender, event.pid);
494     auto err = appMgr->RegisterApplicationStateObserver(appStateObserver_, clientBundleNames_);
495     if (err != RET_OK) {
496         appStateObserver_.clear();
497         FI_HILOGE("IAppMgr::RegisterApplicationStateObserver fail, error:%{public}d", err);
498         return RET_ERR;
499     }
500     return RET_OK;
501 }
502 
UnregisterApplicationStateObserver()503 void StateMachine::UnregisterApplicationStateObserver()
504 {
505     CALL_INFO_TRACE;
506     CHKPV(appStateObserver_);
507     auto appMgr = GetAppMgr();
508     CHKPV(appMgr);
509     FI_HILOGI("Unregister application associateassistant state observer");
510     auto err = appMgr->UnregisterApplicationStateObserver(appStateObserver_);
511     if (err != RET_OK) {
512         FI_HILOGE("IAppMgr::UnregisterApplicationStateObserver fail, error:%{public}d", err);
513     }
514     appStateObserver_.clear();
515 }
516 
UpdateApplicationStateObserver(int32_t clientPid)517 void StateMachine::UpdateApplicationStateObserver(int32_t clientPid)
518 {
519     CALL_INFO_TRACE;
520     CHKPV(appStateObserver_);
521     appStateObserver_->UpdateClientPid(clientPid);
522 }
523 
AddSessionObserver(Context & context,const EnableCooperateEvent & event)524 void StateMachine::AddSessionObserver(Context &context, const EnableCooperateEvent &event)
525 {
526     CALL_INFO_TRACE;
527     RegisterApplicationStateObserver(context.Sender(), event);
528 }
529 
GetPackageName(Security::AccessToken::AccessTokenID tokenId)530 std::string StateMachine::GetPackageName(Security::AccessToken::AccessTokenID tokenId)
531 {
532     CALL_INFO_TRACE;
533     std::string bundleName {"Default"};
534     int32_t tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
535     switch (tokenType) {
536         case Security::AccessToken::ATokenTypeEnum::TOKEN_HAP: {
537             Security::AccessToken::HapTokenInfo hapInfo;
538             if (Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, hapInfo) != RET_OK) {
539                 FI_HILOGE("Get hap token info failed");
540             } else {
541                 bundleName = hapInfo.bundleName;
542             }
543             break;
544         }
545         case Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE:
546         case Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL: {
547             Security::AccessToken::NativeTokenInfo tokenInfo;
548             if (Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(tokenId, tokenInfo) != RET_OK) {
549                 FI_HILOGE("Get native token info failed");
550             } else {
551                 bundleName = tokenInfo.processName;
552             }
553             break;
554         }
555         default: {
556             FI_HILOGW("token type not match");
557             break;
558         }
559     }
560     return bundleName;
561 }
562 
RemoveSessionObserver(Context & context,const DisableCooperateEvent & event)563 void StateMachine::RemoveSessionObserver(Context &context, const DisableCooperateEvent &event)
564 {
565     UnregisterApplicationStateObserver();
566 }
567 
OnCommonEvent(Context & context,const std::string & commonEvent)568 void StateMachine::OnCommonEvent(Context &context, const std::string &commonEvent)
569 {
570     CALL_INFO_TRACE;
571     FI_HILOGI("Current common event:%{public}s", commonEvent.c_str());
572     if (commonEvent == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF ||
573         commonEvent == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_LOCKED) {
574         FI_HILOGI("Receive common event:%{public}s, stop cooperate", commonEvent.c_str());
575         CooperateEvent stopEvent(
576             CooperateEventType::STOP,
577             StopCooperateEvent{
578                 .isUnchained = false
579             }
580         );
581         Transfer(context, stopEvent);
582     }
583 }
584 
AddMonitor(Context & context)585 void StateMachine::AddMonitor(Context &context)
586 {
587     CALL_INFO_TRACE;
588     if (monitorId_ >= 0) {
589         return;
590     }
591     CHKPV(env_);
592     monitorId_ = env_->GetInput().AddMonitor(
593         [sender = context.Sender(), &hotArea = context.hotArea_, &mouseLocation = context.mouseLocation_] (
594             std::shared_ptr<MMI::PointerEvent> pointerEvent) mutable {
595             hotArea.ProcessData(pointerEvent);
596             mouseLocation.ProcessData(pointerEvent);
597 
598             MMI::PointerEvent::PointerItem pointerItem;
599             if (!pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) {
600                 FI_HILOGE("Corrupted pointer event");
601                 return;
602             }
603             auto ret = sender.Send(CooperateEvent(
604                 CooperateEventType::INPUT_POINTER_EVENT,
605                 InputPointerEvent {
606                     .deviceId = pointerEvent->GetDeviceId(),
607                     .pointerAction = pointerEvent->GetPointerAction(),
608                     .sourceType = pointerEvent->GetSourceType(),
609                     .position = Coordinate {
610                         .x = pointerItem.GetDisplayX(),
611                         .y = pointerItem.GetDisplayY(),
612                     }
613                 }));
614             if (ret != Channel<CooperateEvent>::NO_ERROR) {
615                 FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
616             }
617         });
618     if (monitorId_ < 0) {
619         FI_HILOGE("MMI::Add Monitor fail");
620     }
621 }
622 
RemoveMonitor(Context & context)623 void StateMachine::RemoveMonitor(Context &context)
624 {
625     CALL_INFO_TRACE;
626     if (monitorId_ < 0) {
627         return;
628     }
629     env_->GetInput().RemoveMonitor(monitorId_);
630     monitorId_ = -1;
631 }
632 
RemoveWatches(Context & context)633 void StateMachine::RemoveWatches(Context &context)
634 {
635     CALL_INFO_TRACE;
636     for (auto iter = onlineBoards_.begin();
637          iter != onlineBoards_.end(); iter = onlineBoards_.begin()) {
638         FI_HILOGD("Remove watch \'%{public}s\'", Utility::Anonymize(*iter).c_str());
639         onlineBoards_.erase(iter);
640     }
641 }
642 } // namespace Cooperate
643 } // namespace DeviceStatus
644 } // namespace Msdp
645 } // namespace OHOS
646