1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "cooperate_free.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include "devicestatus_define.h" 19c29fa5a6Sopenharmony_ci#include "utility.h" 20c29fa5a6Sopenharmony_ci 21c29fa5a6Sopenharmony_ci#undef LOG_TAG 22c29fa5a6Sopenharmony_ci#define LOG_TAG "CooperateFree" 23c29fa5a6Sopenharmony_ci 24c29fa5a6Sopenharmony_cinamespace OHOS { 25c29fa5a6Sopenharmony_cinamespace Msdp { 26c29fa5a6Sopenharmony_cinamespace DeviceStatus { 27c29fa5a6Sopenharmony_cinamespace Cooperate { 28c29fa5a6Sopenharmony_ci 29c29fa5a6Sopenharmony_ciCooperateFree::CooperateFree(IStateMachine &parent, IContext *env) 30c29fa5a6Sopenharmony_ci : ICooperateState(parent), env_(env) 31c29fa5a6Sopenharmony_ci{ 32c29fa5a6Sopenharmony_ci initial_ = std::make_shared<Initial>(*this); 33c29fa5a6Sopenharmony_ci Initial::BuildChains(initial_, *this); 34c29fa5a6Sopenharmony_ci current_ = initial_; 35c29fa5a6Sopenharmony_ci} 36c29fa5a6Sopenharmony_ci 37c29fa5a6Sopenharmony_ciCooperateFree::~CooperateFree() 38c29fa5a6Sopenharmony_ci{ 39c29fa5a6Sopenharmony_ci Initial::RemoveChains(initial_); 40c29fa5a6Sopenharmony_ci} 41c29fa5a6Sopenharmony_ci 42c29fa5a6Sopenharmony_civoid CooperateFree::OnEvent(Context &context, const CooperateEvent &event) 43c29fa5a6Sopenharmony_ci{ 44c29fa5a6Sopenharmony_ci current_->OnEvent(context, event); 45c29fa5a6Sopenharmony_ci} 46c29fa5a6Sopenharmony_ci 47c29fa5a6Sopenharmony_civoid CooperateFree::OnEnterState(Context &context) 48c29fa5a6Sopenharmony_ci{ 49c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 50c29fa5a6Sopenharmony_ci} 51c29fa5a6Sopenharmony_ci 52c29fa5a6Sopenharmony_civoid CooperateFree::OnLeaveState(Context &context) 53c29fa5a6Sopenharmony_ci{ 54c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 55c29fa5a6Sopenharmony_ci UpdateCooperateFlagEvent event { 56c29fa5a6Sopenharmony_ci .mask = COOPERATE_FLAG_HIDE_CURSOR, 57c29fa5a6Sopenharmony_ci }; 58c29fa5a6Sopenharmony_ci context.UpdateCooperateFlag(event); 59c29fa5a6Sopenharmony_ci} 60c29fa5a6Sopenharmony_ci 61c29fa5a6Sopenharmony_civoid CooperateFree::SetPointerVisible(Context &context) 62c29fa5a6Sopenharmony_ci{ 63c29fa5a6Sopenharmony_ci CHKPV(env_); 64c29fa5a6Sopenharmony_ci bool hasLocalPointerDevice = env_->GetDeviceManager().HasLocalPointerDevice(); 65c29fa5a6Sopenharmony_ci bool visible = !context.NeedHideCursor() && hasLocalPointerDevice; 66c29fa5a6Sopenharmony_ci FI_HILOGI("Set pointer visible:%{public}s, HasLocalPointerDevice:%{public}s", 67c29fa5a6Sopenharmony_ci visible ? "true" : "false", hasLocalPointerDevice ? "true" : "false"); 68c29fa5a6Sopenharmony_ci env_->GetInput().SetPointerVisibility(visible, PRIORITY); 69c29fa5a6Sopenharmony_ci} 70c29fa5a6Sopenharmony_ci 71c29fa5a6Sopenharmony_civoid CooperateFree::UnchainConnections(Context &context, const StopCooperateEvent &event) const 72c29fa5a6Sopenharmony_ci{ 73c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 74c29fa5a6Sopenharmony_ci if (event.isUnchained) { 75c29fa5a6Sopenharmony_ci FI_HILOGI("Unchain all connections"); 76c29fa5a6Sopenharmony_ci context.dsoftbus_.CloseAllSessions(); 77c29fa5a6Sopenharmony_ci context.eventMgr_.OnUnchain(event); 78c29fa5a6Sopenharmony_ci } 79c29fa5a6Sopenharmony_ci} 80c29fa5a6Sopenharmony_ci 81c29fa5a6Sopenharmony_civoid CooperateFree::OnSetCooperatePriv(uint32_t priv) 82c29fa5a6Sopenharmony_ci{ 83c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 84c29fa5a6Sopenharmony_ci env_->GetDragManager().SetCooperatePriv(priv); 85c29fa5a6Sopenharmony_ci} 86c29fa5a6Sopenharmony_ci 87c29fa5a6Sopenharmony_ciCooperateFree::Initial::Initial(CooperateFree &parent) 88c29fa5a6Sopenharmony_ci : ICooperateStep(parent, nullptr), parent_(parent) 89c29fa5a6Sopenharmony_ci{ 90c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::START, [this](Context &context, const CooperateEvent &event) { 91c29fa5a6Sopenharmony_ci this->OnStart(context, event); 92c29fa5a6Sopenharmony_ci }); 93c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::STOP, [this](Context &context, const CooperateEvent &event) { 94c29fa5a6Sopenharmony_ci this->OnStop(context, event); 95c29fa5a6Sopenharmony_ci }); 96c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::APP_CLOSED, [this](Context &context, const CooperateEvent &event) { 97c29fa5a6Sopenharmony_ci this->OnAppClosed(context, event); 98c29fa5a6Sopenharmony_ci }); 99c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::DSOFTBUS_START_COOPERATE, [this](Context &context, const CooperateEvent &event) { 100c29fa5a6Sopenharmony_ci this->OnRemoteStart(context, event); 101c29fa5a6Sopenharmony_ci }); 102c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::INPUT_POINTER_EVENT, [this](Context &context, const CooperateEvent &event) { 103c29fa5a6Sopenharmony_ci this->OnPointerEvent(context, event); 104c29fa5a6Sopenharmony_ci }); 105c29fa5a6Sopenharmony_ci} 106c29fa5a6Sopenharmony_ci 107c29fa5a6Sopenharmony_civoid CooperateFree::Initial::OnProgress(Context &context, const CooperateEvent &event) 108c29fa5a6Sopenharmony_ci{} 109c29fa5a6Sopenharmony_ci 110c29fa5a6Sopenharmony_civoid CooperateFree::Initial::OnReset(Context &context, const CooperateEvent &event) 111c29fa5a6Sopenharmony_ci{} 112c29fa5a6Sopenharmony_ci 113c29fa5a6Sopenharmony_civoid CooperateFree::Initial::BuildChains(std::shared_ptr<Initial> initial, CooperateFree &parent) 114c29fa5a6Sopenharmony_ci{} 115c29fa5a6Sopenharmony_ci 116c29fa5a6Sopenharmony_civoid CooperateFree::Initial::RemoveChains(std::shared_ptr<Initial> initial) 117c29fa5a6Sopenharmony_ci{} 118c29fa5a6Sopenharmony_ci 119c29fa5a6Sopenharmony_civoid CooperateFree::Initial::OnStart(Context &context, const CooperateEvent &event) 120c29fa5a6Sopenharmony_ci{ 121c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 122c29fa5a6Sopenharmony_ci StartCooperateEvent notice = std::get<StartCooperateEvent>(event.event); 123c29fa5a6Sopenharmony_ci FI_HILOGI("[start cooperation] With \'%{public}s\'", Utility::Anonymize(notice.remoteNetworkId).c_str()); 124c29fa5a6Sopenharmony_ci context.StartCooperate(notice); 125c29fa5a6Sopenharmony_ci context.eventMgr_.StartCooperate(notice); 126c29fa5a6Sopenharmony_ci 127c29fa5a6Sopenharmony_ci int32_t ret = context.dsoftbus_.OpenSession(context.Peer()); 128c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 129c29fa5a6Sopenharmony_ci FI_HILOGE("[start cooperation] Failed to connect to \'%{public}s\'", 130c29fa5a6Sopenharmony_ci Utility::Anonymize(context.Peer()).c_str()); 131c29fa5a6Sopenharmony_ci int32_t errNum = (ret == RET_ERR ? static_cast<int32_t>(CoordinationErrCode::OPEN_SESSION_FAILED) : ret); 132c29fa5a6Sopenharmony_ci DSoftbusStartCooperateFinished failNotice { 133c29fa5a6Sopenharmony_ci .success = false, 134c29fa5a6Sopenharmony_ci .errCode = errNum 135c29fa5a6Sopenharmony_ci }; 136c29fa5a6Sopenharmony_ci context.eventMgr_.StartCooperateFinish(failNotice); 137c29fa5a6Sopenharmony_ci return; 138c29fa5a6Sopenharmony_ci } 139c29fa5a6Sopenharmony_ci DSoftbusStartCooperate startNotice { 140c29fa5a6Sopenharmony_ci .originNetworkId = context.Local(), 141c29fa5a6Sopenharmony_ci .success = true, 142c29fa5a6Sopenharmony_ci .cursorPos = context.NormalizedCursorPosition(), 143c29fa5a6Sopenharmony_ci }; 144c29fa5a6Sopenharmony_ci context.OnStartCooperate(startNotice.extra); 145c29fa5a6Sopenharmony_ci context.dsoftbus_.StartCooperate(context.Peer(), startNotice); 146c29fa5a6Sopenharmony_ci context.inputEventInterceptor_.Enable(context); 147c29fa5a6Sopenharmony_ci context.eventMgr_.StartCooperateFinish(startNotice); 148c29fa5a6Sopenharmony_ci FI_HILOGI("[start cooperation] Cooperation with \'%{public}s\' established", 149c29fa5a6Sopenharmony_ci Utility::Anonymize(context.Peer()).c_str()); 150c29fa5a6Sopenharmony_ci TransiteTo(context, CooperateState::COOPERATE_STATE_OUT); 151c29fa5a6Sopenharmony_ci context.OnTransitionOut(); 152c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK 153c29fa5a6Sopenharmony_ci std::ostringstream ss; 154c29fa5a6Sopenharmony_ci ss << "start_cooperation_with_ " << Utility::Anonymize(context.Peer()).c_str(); 155c29fa5a6Sopenharmony_ci context.FinishTrace(ss.str()); 156c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK 157c29fa5a6Sopenharmony_ci} 158c29fa5a6Sopenharmony_ci 159c29fa5a6Sopenharmony_civoid CooperateFree::Initial::OnStop(Context &context, const CooperateEvent &event) 160c29fa5a6Sopenharmony_ci{ 161c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 162c29fa5a6Sopenharmony_ci StopCooperateEvent param = std::get<StopCooperateEvent>(event.event); 163c29fa5a6Sopenharmony_ci context.eventMgr_.StopCooperate(param); 164c29fa5a6Sopenharmony_ci DSoftbusStopCooperateFinished notice { 165c29fa5a6Sopenharmony_ci .normal = true, 166c29fa5a6Sopenharmony_ci }; 167c29fa5a6Sopenharmony_ci context.eventMgr_.StopCooperateFinish(notice); 168c29fa5a6Sopenharmony_ci parent_.UnchainConnections(context, param); 169c29fa5a6Sopenharmony_ci} 170c29fa5a6Sopenharmony_ci 171c29fa5a6Sopenharmony_civoid CooperateFree::Initial::OnAppClosed(Context &context, const CooperateEvent &event) 172c29fa5a6Sopenharmony_ci{ 173c29fa5a6Sopenharmony_ci FI_HILOGI("[app closed] Close all connections"); 174c29fa5a6Sopenharmony_ci context.dsoftbus_.CloseAllSessions(); 175c29fa5a6Sopenharmony_ci} 176c29fa5a6Sopenharmony_ci 177c29fa5a6Sopenharmony_civoid CooperateFree::Initial::OnRemoteStart(Context &context, const CooperateEvent &event) 178c29fa5a6Sopenharmony_ci{ 179c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 180c29fa5a6Sopenharmony_ci DSoftbusStartCooperate notice = std::get<DSoftbusStartCooperate>(event.event); 181c29fa5a6Sopenharmony_ci context.OnRemoteStartCooperate(notice.extra); 182c29fa5a6Sopenharmony_ci parent_.OnSetCooperatePriv(notice.extra.priv); 183c29fa5a6Sopenharmony_ci context.eventMgr_.RemoteStart(notice); 184c29fa5a6Sopenharmony_ci context.RemoteStartSuccess(notice); 185c29fa5a6Sopenharmony_ci context.inputEventBuilder_.Enable(context); 186c29fa5a6Sopenharmony_ci context.eventMgr_.RemoteStartFinish(notice); 187c29fa5a6Sopenharmony_ci context.inputDevMgr_.AddVirtualInputDevice(context.Peer()); 188c29fa5a6Sopenharmony_ci FI_HILOGI("[remote start] Cooperation with \'%{public}s\' established", Utility::Anonymize(context.Peer()).c_str()); 189c29fa5a6Sopenharmony_ci TransiteTo(context, CooperateState::COOPERATE_STATE_IN); 190c29fa5a6Sopenharmony_ci context.OnTransitionIn(); 191c29fa5a6Sopenharmony_ci} 192c29fa5a6Sopenharmony_ci 193c29fa5a6Sopenharmony_civoid CooperateFree::Initial::OnPointerEvent(Context &context, const CooperateEvent &event) 194c29fa5a6Sopenharmony_ci{ 195c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 196c29fa5a6Sopenharmony_ci InputPointerEvent notice = std::get<InputPointerEvent>(event.event); 197c29fa5a6Sopenharmony_ci if (InputEventBuilder::IsLocalEvent(notice) && context.NeedHideCursor()) { 198c29fa5a6Sopenharmony_ci UpdateCooperateFlagEvent event { 199c29fa5a6Sopenharmony_ci .mask = COOPERATE_FLAG_HIDE_CURSOR, 200c29fa5a6Sopenharmony_ci }; 201c29fa5a6Sopenharmony_ci context.UpdateCooperateFlag(event); 202c29fa5a6Sopenharmony_ci parent_.SetPointerVisible(context); 203c29fa5a6Sopenharmony_ci } 204c29fa5a6Sopenharmony_ci} 205c29fa5a6Sopenharmony_ci} // namespace Cooperate 206c29fa5a6Sopenharmony_ci} // namespace DeviceStatus 207c29fa5a6Sopenharmony_ci} // namespace Msdp 208c29fa5a6Sopenharmony_ci} // namespace OHOS 209