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 "cooperate_free.h"
17
18 #include "devicestatus_define.h"
19 #include "utility.h"
20
21 #undef LOG_TAG
22 #define LOG_TAG "CooperateFree"
23
24 namespace OHOS {
25 namespace Msdp {
26 namespace DeviceStatus {
27 namespace Cooperate {
28
CooperateFree(IStateMachine & parent,IContext * env)29 CooperateFree::CooperateFree(IStateMachine &parent, IContext *env)
30 : ICooperateState(parent), env_(env)
31 {
32 initial_ = std::make_shared<Initial>(*this);
33 Initial::BuildChains(initial_, *this);
34 current_ = initial_;
35 }
36
~CooperateFree()37 CooperateFree::~CooperateFree()
38 {
39 Initial::RemoveChains(initial_);
40 }
41
OnEvent(Context & context,const CooperateEvent & event)42 void CooperateFree::OnEvent(Context &context, const CooperateEvent &event)
43 {
44 current_->OnEvent(context, event);
45 }
46
OnEnterState(Context & context)47 void CooperateFree::OnEnterState(Context &context)
48 {
49 CALL_INFO_TRACE;
50 }
51
OnLeaveState(Context & context)52 void CooperateFree::OnLeaveState(Context &context)
53 {
54 CALL_INFO_TRACE;
55 UpdateCooperateFlagEvent event {
56 .mask = COOPERATE_FLAG_HIDE_CURSOR,
57 };
58 context.UpdateCooperateFlag(event);
59 }
60
SetPointerVisible(Context & context)61 void CooperateFree::SetPointerVisible(Context &context)
62 {
63 CHKPV(env_);
64 bool hasLocalPointerDevice = env_->GetDeviceManager().HasLocalPointerDevice();
65 bool visible = !context.NeedHideCursor() && hasLocalPointerDevice;
66 FI_HILOGI("Set pointer visible:%{public}s, HasLocalPointerDevice:%{public}s",
67 visible ? "true" : "false", hasLocalPointerDevice ? "true" : "false");
68 env_->GetInput().SetPointerVisibility(visible, PRIORITY);
69 }
70
UnchainConnections(Context & context,const StopCooperateEvent & event) const71 void CooperateFree::UnchainConnections(Context &context, const StopCooperateEvent &event) const
72 {
73 CALL_DEBUG_ENTER;
74 if (event.isUnchained) {
75 FI_HILOGI("Unchain all connections");
76 context.dsoftbus_.CloseAllSessions();
77 context.eventMgr_.OnUnchain(event);
78 }
79 }
80
OnSetCooperatePriv(uint32_t priv)81 void CooperateFree::OnSetCooperatePriv(uint32_t priv)
82 {
83 CALL_DEBUG_ENTER;
84 env_->GetDragManager().SetCooperatePriv(priv);
85 }
86
Initial(CooperateFree & parent)87 CooperateFree::Initial::Initial(CooperateFree &parent)
88 : ICooperateStep(parent, nullptr), parent_(parent)
89 {
90 AddHandler(CooperateEventType::START, [this](Context &context, const CooperateEvent &event) {
91 this->OnStart(context, event);
92 });
93 AddHandler(CooperateEventType::STOP, [this](Context &context, const CooperateEvent &event) {
94 this->OnStop(context, event);
95 });
96 AddHandler(CooperateEventType::APP_CLOSED, [this](Context &context, const CooperateEvent &event) {
97 this->OnAppClosed(context, event);
98 });
99 AddHandler(CooperateEventType::DSOFTBUS_START_COOPERATE, [this](Context &context, const CooperateEvent &event) {
100 this->OnRemoteStart(context, event);
101 });
102 AddHandler(CooperateEventType::INPUT_POINTER_EVENT, [this](Context &context, const CooperateEvent &event) {
103 this->OnPointerEvent(context, event);
104 });
105 }
106
OnProgress(Context & context,const CooperateEvent & event)107 void CooperateFree::Initial::OnProgress(Context &context, const CooperateEvent &event)
108 {}
109
OnReset(Context & context,const CooperateEvent & event)110 void CooperateFree::Initial::OnReset(Context &context, const CooperateEvent &event)
111 {}
112
BuildChains(std::shared_ptr<Initial> initial,CooperateFree & parent)113 void CooperateFree::Initial::BuildChains(std::shared_ptr<Initial> initial, CooperateFree &parent)
114 {}
115
RemoveChains(std::shared_ptr<Initial> initial)116 void CooperateFree::Initial::RemoveChains(std::shared_ptr<Initial> initial)
117 {}
118
OnStart(Context & context,const CooperateEvent & event)119 void CooperateFree::Initial::OnStart(Context &context, const CooperateEvent &event)
120 {
121 CALL_INFO_TRACE;
122 StartCooperateEvent notice = std::get<StartCooperateEvent>(event.event);
123 FI_HILOGI("[start cooperation] With \'%{public}s\'", Utility::Anonymize(notice.remoteNetworkId).c_str());
124 context.StartCooperate(notice);
125 context.eventMgr_.StartCooperate(notice);
126
127 int32_t ret = context.dsoftbus_.OpenSession(context.Peer());
128 if (ret != RET_OK) {
129 FI_HILOGE("[start cooperation] Failed to connect to \'%{public}s\'",
130 Utility::Anonymize(context.Peer()).c_str());
131 int32_t errNum = (ret == RET_ERR ? static_cast<int32_t>(CoordinationErrCode::OPEN_SESSION_FAILED) : ret);
132 DSoftbusStartCooperateFinished failNotice {
133 .success = false,
134 .errCode = errNum
135 };
136 context.eventMgr_.StartCooperateFinish(failNotice);
137 return;
138 }
139 DSoftbusStartCooperate startNotice {
140 .originNetworkId = context.Local(),
141 .success = true,
142 .cursorPos = context.NormalizedCursorPosition(),
143 };
144 context.OnStartCooperate(startNotice.extra);
145 context.dsoftbus_.StartCooperate(context.Peer(), startNotice);
146 context.inputEventInterceptor_.Enable(context);
147 context.eventMgr_.StartCooperateFinish(startNotice);
148 FI_HILOGI("[start cooperation] Cooperation with \'%{public}s\' established",
149 Utility::Anonymize(context.Peer()).c_str());
150 TransiteTo(context, CooperateState::COOPERATE_STATE_OUT);
151 context.OnTransitionOut();
152 #ifdef ENABLE_PERFORMANCE_CHECK
153 std::ostringstream ss;
154 ss << "start_cooperation_with_ " << Utility::Anonymize(context.Peer()).c_str();
155 context.FinishTrace(ss.str());
156 #endif // ENABLE_PERFORMANCE_CHECK
157 }
158
OnStop(Context & context,const CooperateEvent & event)159 void CooperateFree::Initial::OnStop(Context &context, const CooperateEvent &event)
160 {
161 CALL_DEBUG_ENTER;
162 StopCooperateEvent param = std::get<StopCooperateEvent>(event.event);
163 context.eventMgr_.StopCooperate(param);
164 param.networkId = context.Peer();
165 DSoftbusStopCooperateFinished notice {
166 .networkId = context.Peer(),
167 .normal = true,
168 };
169 context.eventMgr_.StopCooperateFinish(notice);
170 parent_.UnchainConnections(context, param);
171 }
172
OnAppClosed(Context & context,const CooperateEvent & event)173 void CooperateFree::Initial::OnAppClosed(Context &context, const CooperateEvent &event)
174 {
175 FI_HILOGI("[app closed] Close all connections");
176 context.dsoftbus_.CloseAllSessions();
177 }
178
OnRemoteStart(Context & context,const CooperateEvent & event)179 void CooperateFree::Initial::OnRemoteStart(Context &context, const CooperateEvent &event)
180 {
181 CALL_INFO_TRACE;
182 DSoftbusStartCooperate notice = std::get<DSoftbusStartCooperate>(event.event);
183 context.OnRemoteStartCooperate(notice.extra);
184 parent_.OnSetCooperatePriv(notice.extra.priv);
185 context.eventMgr_.RemoteStart(notice);
186 context.RemoteStartSuccess(notice);
187 context.inputEventBuilder_.Enable(context);
188 context.eventMgr_.RemoteStartFinish(notice);
189 context.inputDevMgr_.AddVirtualInputDevice(context.Peer());
190 FI_HILOGI("[remote start] Cooperation with \'%{public}s\' established", Utility::Anonymize(context.Peer()).c_str());
191 TransiteTo(context, CooperateState::COOPERATE_STATE_IN);
192 context.OnTransitionIn();
193 }
194
OnPointerEvent(Context & context,const CooperateEvent & event)195 void CooperateFree::Initial::OnPointerEvent(Context &context, const CooperateEvent &event)
196 {
197 CALL_DEBUG_ENTER;
198 InputPointerEvent notice = std::get<InputPointerEvent>(event.event);
199 if (InputEventBuilder::IsLocalEvent(notice) && context.NeedHideCursor()) {
200 UpdateCooperateFlagEvent event {
201 .mask = COOPERATE_FLAG_HIDE_CURSOR,
202 };
203 context.UpdateCooperateFlag(event);
204 parent_.SetPointerVisible(context);
205 }
206 }
207 } // namespace Cooperate
208 } // namespace DeviceStatus
209 } // namespace Msdp
210 } // namespace OHOS
211