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