1f857971dSopenharmony_ci/*
2f857971dSopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3f857971dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f857971dSopenharmony_ci * you may not use this file except in compliance with the License.
5f857971dSopenharmony_ci * You may obtain a copy of the License at
6f857971dSopenharmony_ci *
7f857971dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f857971dSopenharmony_ci *
9f857971dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f857971dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f857971dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f857971dSopenharmony_ci * See the License for the specific language governing permissions and
13f857971dSopenharmony_ci * limitations under the License.
14f857971dSopenharmony_ci */
15f857971dSopenharmony_ci
16f857971dSopenharmony_ci#include "cooperate_context.h"
17f857971dSopenharmony_ci
18f857971dSopenharmony_ci#include <algorithm>
19f857971dSopenharmony_ci
20f857971dSopenharmony_ci#include "display_manager.h"
21f857971dSopenharmony_ci#include "ddm_adapter.h"
22f857971dSopenharmony_ci#include "devicestatus_define.h"
23f857971dSopenharmony_ci#include "dsoftbus_handler.h"
24f857971dSopenharmony_ci#include "utility.h"
25f857971dSopenharmony_ci
26f857971dSopenharmony_ci#undef LOG_TAG
27f857971dSopenharmony_ci#define LOG_TAG "CooperateContext"
28f857971dSopenharmony_ci
29f857971dSopenharmony_cinamespace OHOS {
30f857971dSopenharmony_cinamespace Msdp {
31f857971dSopenharmony_cinamespace DeviceStatus {
32f857971dSopenharmony_cinamespace Cooperate {
33f857971dSopenharmony_cinamespace {
34f857971dSopenharmony_ciconst std::string THREAD_NAME { "os_Cooperate_EventHandler" };
35f857971dSopenharmony_ciconstexpr double PERCENT { 100.0 };
36f857971dSopenharmony_ci} // namespace
37f857971dSopenharmony_ci
38f857971dSopenharmony_ciclass BoardObserver final : public IBoardObserver {
39f857971dSopenharmony_cipublic:
40f857971dSopenharmony_ci    explicit BoardObserver(Channel<CooperateEvent>::Sender sender) : sender_(sender) {}
41f857971dSopenharmony_ci    ~BoardObserver() = default;
42f857971dSopenharmony_ci    DISALLOW_COPY_AND_MOVE(BoardObserver);
43f857971dSopenharmony_ci
44f857971dSopenharmony_ci    void OnBoardOnline(const std::string &networkId) override
45f857971dSopenharmony_ci    {
46f857971dSopenharmony_ci        FI_HILOGD("\'%{public}s\' is online", Utility::Anonymize(networkId).c_str());
47f857971dSopenharmony_ci        auto ret = sender_.Send(CooperateEvent(
48f857971dSopenharmony_ci            CooperateEventType::DDM_BOARD_ONLINE,
49f857971dSopenharmony_ci            DDMBoardOnlineEvent {
50f857971dSopenharmony_ci                .networkId = networkId
51f857971dSopenharmony_ci            }));
52f857971dSopenharmony_ci        if (ret != Channel<CooperateEvent>::NO_ERROR) {
53f857971dSopenharmony_ci            FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
54f857971dSopenharmony_ci        }
55f857971dSopenharmony_ci    }
56f857971dSopenharmony_ci
57f857971dSopenharmony_ci    void OnBoardOffline(const std::string &networkId) override
58f857971dSopenharmony_ci    {
59f857971dSopenharmony_ci        FI_HILOGD("\'%{public}s\' is offline", Utility::Anonymize(networkId).c_str());
60f857971dSopenharmony_ci        auto ret = sender_.Send(CooperateEvent(
61f857971dSopenharmony_ci            CooperateEventType::DDM_BOARD_OFFLINE,
62f857971dSopenharmony_ci            DDMBoardOfflineEvent {
63f857971dSopenharmony_ci                .networkId = networkId
64f857971dSopenharmony_ci            }));
65f857971dSopenharmony_ci        if (ret != Channel<CooperateEvent>::NO_ERROR) {
66f857971dSopenharmony_ci            FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
67f857971dSopenharmony_ci        }
68f857971dSopenharmony_ci    }
69f857971dSopenharmony_ci
70f857971dSopenharmony_ciprivate:
71f857971dSopenharmony_ci    Channel<CooperateEvent>::Sender sender_;
72f857971dSopenharmony_ci};
73f857971dSopenharmony_ci
74f857971dSopenharmony_civoid HotplugObserver::OnDeviceAdded(std::shared_ptr<IDevice> dev)
75f857971dSopenharmony_ci{
76f857971dSopenharmony_ci    CHKPV(dev);
77f857971dSopenharmony_ci    auto ret = sender_.Send(CooperateEvent(
78f857971dSopenharmony_ci        CooperateEventType::INPUT_HOTPLUG_EVENT,
79f857971dSopenharmony_ci        InputHotplugEvent {
80f857971dSopenharmony_ci            .deviceId = dev->GetId(),
81f857971dSopenharmony_ci            .type = InputHotplugType::PLUG,
82f857971dSopenharmony_ci            .isKeyboard = dev->IsKeyboard(),
83f857971dSopenharmony_ci        }));
84f857971dSopenharmony_ci    if (ret != Channel<CooperateEvent>::NO_ERROR) {
85f857971dSopenharmony_ci        FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
86f857971dSopenharmony_ci    }
87f857971dSopenharmony_ci}
88f857971dSopenharmony_ci
89f857971dSopenharmony_civoid HotplugObserver::OnDeviceRemoved(std::shared_ptr<IDevice> dev)
90f857971dSopenharmony_ci{
91f857971dSopenharmony_ci    CHKPV(dev);
92f857971dSopenharmony_ci    auto ret = sender_.Send(CooperateEvent(
93f857971dSopenharmony_ci        CooperateEventType::INPUT_HOTPLUG_EVENT,
94f857971dSopenharmony_ci        InputHotplugEvent {
95f857971dSopenharmony_ci            .deviceId = dev->GetId(),
96f857971dSopenharmony_ci            .type = InputHotplugType::UNPLUG,
97f857971dSopenharmony_ci            .isKeyboard = dev->IsKeyboard(),
98f857971dSopenharmony_ci        }));
99f857971dSopenharmony_ci    if (ret != Channel<CooperateEvent>::NO_ERROR) {
100f857971dSopenharmony_ci        FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
101f857971dSopenharmony_ci    }
102f857971dSopenharmony_ci}
103f857971dSopenharmony_ci
104f857971dSopenharmony_ciContext::Context(IContext *env)
105f857971dSopenharmony_ci    : dsoftbus_(env), eventMgr_(env), hotArea_(env), mouseLocation_(env), inputDevMgr_(env),
106f857971dSopenharmony_ci      inputEventBuilder_(env), inputEventInterceptor_(env), env_(env)
107f857971dSopenharmony_ci{}
108f857971dSopenharmony_ci
109f857971dSopenharmony_civoid Context::AttachSender(Channel<CooperateEvent>::Sender sender)
110f857971dSopenharmony_ci{
111f857971dSopenharmony_ci    sender_ = sender;
112f857971dSopenharmony_ci    dsoftbus_.AttachSender(sender);
113f857971dSopenharmony_ci}
114f857971dSopenharmony_ci
115f857971dSopenharmony_civoid Context::AddObserver(std::shared_ptr<ICooperateObserver> observer)
116f857971dSopenharmony_ci{
117f857971dSopenharmony_ci    CHKPV(observer);
118f857971dSopenharmony_ci    observers_.insert(observer);
119f857971dSopenharmony_ci}
120f857971dSopenharmony_ci
121f857971dSopenharmony_civoid Context::RemoveObserver(std::shared_ptr<ICooperateObserver> observer)
122f857971dSopenharmony_ci{
123f857971dSopenharmony_ci    observers_.erase(observer);
124f857971dSopenharmony_ci}
125f857971dSopenharmony_ci
126f857971dSopenharmony_civoid Context::Enable()
127f857971dSopenharmony_ci{
128f857971dSopenharmony_ci    CALL_DEBUG_ENTER;
129f857971dSopenharmony_ci    StartEventHandler();
130f857971dSopenharmony_ci    EnableDDM();
131f857971dSopenharmony_ci    EnableDevMgr();
132f857971dSopenharmony_ci    EnableInputDevMgr();
133f857971dSopenharmony_ci}
134f857971dSopenharmony_ci
135f857971dSopenharmony_civoid Context::Disable()
136f857971dSopenharmony_ci{
137f857971dSopenharmony_ci    CALL_DEBUG_ENTER;
138f857971dSopenharmony_ci    DisableDevMgr();
139f857971dSopenharmony_ci    DisableDDM();
140f857971dSopenharmony_ci    DisableInputDevMgr();
141f857971dSopenharmony_ci    StopEventHandler();
142f857971dSopenharmony_ci}
143f857971dSopenharmony_ci
144f857971dSopenharmony_ciint32_t Context::StartEventHandler()
145f857971dSopenharmony_ci{
146f857971dSopenharmony_ci    auto runner = AppExecFwk::EventRunner::Create(THREAD_NAME, AppExecFwk::ThreadMode::FFRT);
147f857971dSopenharmony_ci    CHKPR(runner, RET_ERR);
148f857971dSopenharmony_ci    eventHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
149f857971dSopenharmony_ci    return RET_OK;
150f857971dSopenharmony_ci}
151f857971dSopenharmony_ci
152f857971dSopenharmony_civoid Context::StopEventHandler()
153f857971dSopenharmony_ci{
154f857971dSopenharmony_ci    eventHandler_.reset();
155f857971dSopenharmony_ci}
156f857971dSopenharmony_ci
157f857971dSopenharmony_civoid Context::EnableDDM()
158f857971dSopenharmony_ci{
159f857971dSopenharmony_ci    boardObserver_ = std::make_shared<BoardObserver>(sender_);
160f857971dSopenharmony_ci    env_->GetDDM().AddBoardObserver(boardObserver_);
161f857971dSopenharmony_ci}
162f857971dSopenharmony_ci
163f857971dSopenharmony_civoid Context::DisableDDM()
164f857971dSopenharmony_ci{
165f857971dSopenharmony_ci    env_->GetDDM().RemoveBoardObserver(boardObserver_);
166f857971dSopenharmony_ci    boardObserver_.reset();
167f857971dSopenharmony_ci}
168f857971dSopenharmony_ci
169f857971dSopenharmony_ciint32_t Context::EnableDevMgr()
170f857971dSopenharmony_ci{
171f857971dSopenharmony_ci    hotplugObserver_ = std::make_shared<HotplugObserver>(sender_);
172f857971dSopenharmony_ci    env_->GetDeviceManager().AddDeviceObserver(hotplugObserver_);
173f857971dSopenharmony_ci    return RET_OK;
174f857971dSopenharmony_ci}
175f857971dSopenharmony_ci
176f857971dSopenharmony_civoid Context::DisableDevMgr()
177f857971dSopenharmony_ci{
178f857971dSopenharmony_ci    env_->GetDeviceManager().RemoveDeviceObserver(hotplugObserver_);
179f857971dSopenharmony_ci    hotplugObserver_.reset();
180f857971dSopenharmony_ci}
181f857971dSopenharmony_ci
182f857971dSopenharmony_ciint32_t Context::EnableInputDevMgr()
183f857971dSopenharmony_ci{
184f857971dSopenharmony_ci    inputDevMgr_.Enable();
185f857971dSopenharmony_ci    return RET_OK;
186f857971dSopenharmony_ci}
187f857971dSopenharmony_ci
188f857971dSopenharmony_civoid Context::DisableInputDevMgr()
189f857971dSopenharmony_ci{
190f857971dSopenharmony_ci    inputDevMgr_.Disable();
191f857971dSopenharmony_ci}
192f857971dSopenharmony_ci
193f857971dSopenharmony_ciNormalizedCoordinate Context::NormalizedCursorPosition() const
194f857971dSopenharmony_ci{
195f857971dSopenharmony_ci    auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
196f857971dSopenharmony_ci    if (display == nullptr) {
197f857971dSopenharmony_ci        FI_HILOGE("No default display");
198f857971dSopenharmony_ci        return cursorPos_;
199f857971dSopenharmony_ci    }
200f857971dSopenharmony_ci    Rectangle displayRect {
201f857971dSopenharmony_ci        .width = display->GetWidth(),
202f857971dSopenharmony_ci        .height = display->GetHeight(),
203f857971dSopenharmony_ci    };
204f857971dSopenharmony_ci    if ((displayRect.width <= 0) || (displayRect.height <= 0)) {
205f857971dSopenharmony_ci        FI_HILOGE("Invalid display information");
206f857971dSopenharmony_ci        return cursorPos_;
207f857971dSopenharmony_ci    }
208f857971dSopenharmony_ci    return NormalizedCoordinate {
209f857971dSopenharmony_ci        .x = static_cast<int32_t>((cursorPos_.x + 1) * PERCENT / displayRect.width),
210f857971dSopenharmony_ci        .y = static_cast<int32_t>((cursorPos_.y + 1) * PERCENT / displayRect.height),
211f857971dSopenharmony_ci    };
212f857971dSopenharmony_ci}
213f857971dSopenharmony_ci
214f857971dSopenharmony_civoid Context::EnableCooperate(const EnableCooperateEvent &event)
215f857971dSopenharmony_ci{
216f857971dSopenharmony_ci}
217f857971dSopenharmony_ci
218f857971dSopenharmony_civoid Context::DisableCooperate(const DisableCooperateEvent &event)
219f857971dSopenharmony_ci{
220f857971dSopenharmony_ci}
221f857971dSopenharmony_ci
222f857971dSopenharmony_civoid Context::StartCooperate(const StartCooperateEvent &event)
223f857971dSopenharmony_ci{
224f857971dSopenharmony_ci    remoteNetworkId_ = event.remoteNetworkId;
225f857971dSopenharmony_ci    startDeviceId_ = event.startDeviceId;
226f857971dSopenharmony_ci}
227f857971dSopenharmony_ci
228f857971dSopenharmony_civoid Context::OnPointerEvent(const InputPointerEvent &event)
229f857971dSopenharmony_ci{
230f857971dSopenharmony_ci    if ((event.sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE) &&
231f857971dSopenharmony_ci        ((event.pointerAction == MMI::PointerEvent::POINTER_ACTION_MOVE) ||
232f857971dSopenharmony_ci         (event.pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_MOVE))) {
233f857971dSopenharmony_ci        cursorPos_ = event.position;
234f857971dSopenharmony_ci    }
235f857971dSopenharmony_ci}
236f857971dSopenharmony_ci
237f857971dSopenharmony_civoid Context::RemoteStartSuccess(const DSoftbusStartCooperateFinished &event)
238f857971dSopenharmony_ci{
239f857971dSopenharmony_ci    remoteNetworkId_ = event.originNetworkId;
240f857971dSopenharmony_ci    flag_ = event.extra.flag;
241f857971dSopenharmony_ci    SetCursorPosition(event.cursorPos);
242f857971dSopenharmony_ci}
243f857971dSopenharmony_ci
244f857971dSopenharmony_civoid Context::RelayCooperate(const DSoftbusRelayCooperate &event)
245f857971dSopenharmony_ci{
246f857971dSopenharmony_ci    remoteNetworkId_ = event.targetNetworkId;
247f857971dSopenharmony_ci}
248f857971dSopenharmony_ci
249f857971dSopenharmony_civoid Context::UpdateCooperateFlag(const UpdateCooperateFlagEvent &event)
250f857971dSopenharmony_ci{
251f857971dSopenharmony_ci    flag_ = ((flag_ & ~event.mask) | (event.flag & event.mask));
252f857971dSopenharmony_ci}
253f857971dSopenharmony_ci
254f857971dSopenharmony_cibool Context::IsAllowCooperate()
255f857971dSopenharmony_ci{
256f857971dSopenharmony_ci    FI_HILOGI("Notify observers of allow cooperate");
257f857971dSopenharmony_ci    return std::all_of(observers_.cbegin(), observers_.cend(), [](const auto &observer) {
258f857971dSopenharmony_ci        return observer->IsAllowCooperate();
259f857971dSopenharmony_ci    });
260f857971dSopenharmony_ci}
261f857971dSopenharmony_ci
262f857971dSopenharmony_civoid Context::OnStartCooperate(StartCooperateData &data)
263f857971dSopenharmony_ci{
264f857971dSopenharmony_ci    std::for_each(observers_.cbegin(), observers_.cend(), [&data](const auto &observer) {
265f857971dSopenharmony_ci        return observer->OnStartCooperate(data);
266f857971dSopenharmony_ci    });
267f857971dSopenharmony_ci}
268f857971dSopenharmony_ci
269f857971dSopenharmony_civoid Context::OnRemoteStartCooperate(RemoteStartCooperateData &data)
270f857971dSopenharmony_ci{
271f857971dSopenharmony_ci    std::for_each(observers_.cbegin(), observers_.cend(), [&data](const auto &observer) {
272f857971dSopenharmony_ci        return observer->OnRemoteStartCooperate(data);
273f857971dSopenharmony_ci    });
274f857971dSopenharmony_ci}
275f857971dSopenharmony_ci
276f857971dSopenharmony_civoid Context::OnTransitionOut()
277f857971dSopenharmony_ci{
278f857971dSopenharmony_ci    CHKPV(eventHandler_);
279f857971dSopenharmony_ci    FI_HILOGI("Notify observers of transition out");
280f857971dSopenharmony_ci    for (const auto &observer : observers_) {
281f857971dSopenharmony_ci        eventHandler_->PostTask(
282f857971dSopenharmony_ci            [observer, remoteNetworkId = Peer(), cursorPos = NormalizedCursorPosition()] {
283f857971dSopenharmony_ci                FI_HILOGI("Notify one observer of transition out");
284f857971dSopenharmony_ci                CHKPV(observer);
285f857971dSopenharmony_ci                observer->OnTransitionOut(remoteNetworkId, cursorPos);
286f857971dSopenharmony_ci            });
287f857971dSopenharmony_ci    }
288f857971dSopenharmony_ci}
289f857971dSopenharmony_ci
290f857971dSopenharmony_civoid Context::OnTransitionIn()
291f857971dSopenharmony_ci{
292f857971dSopenharmony_ci    CHKPV(eventHandler_);
293f857971dSopenharmony_ci    FI_HILOGI("Notify observers of transition in");
294f857971dSopenharmony_ci    for (const auto &observer : observers_) {
295f857971dSopenharmony_ci        eventHandler_->PostTask(
296f857971dSopenharmony_ci            [observer, remoteNetworkId = Peer(), cursorPos = NormalizedCursorPosition()] {
297f857971dSopenharmony_ci                FI_HILOGI("Notify one observer of transition in");
298f857971dSopenharmony_ci                CHKPV(observer);
299f857971dSopenharmony_ci                observer->OnTransitionIn(remoteNetworkId, cursorPos);
300f857971dSopenharmony_ci            });
301f857971dSopenharmony_ci    }
302f857971dSopenharmony_ci}
303f857971dSopenharmony_ci
304f857971dSopenharmony_civoid Context::OnBack()
305f857971dSopenharmony_ci{
306f857971dSopenharmony_ci    CHKPV(eventHandler_);
307f857971dSopenharmony_ci    FI_HILOGI("Notify observers of come back");
308f857971dSopenharmony_ci    for (const auto &observer : observers_) {
309f857971dSopenharmony_ci        eventHandler_->PostTask(
310f857971dSopenharmony_ci            [observer, remoteNetworkId = Peer(), cursorPos = NormalizedCursorPosition()] {
311f857971dSopenharmony_ci                FI_HILOGI("Notify one observer of come back");
312f857971dSopenharmony_ci                CHKPV(observer);
313f857971dSopenharmony_ci                observer->OnBack(remoteNetworkId, cursorPos);
314f857971dSopenharmony_ci            });
315f857971dSopenharmony_ci    }
316f857971dSopenharmony_ci}
317f857971dSopenharmony_ci
318f857971dSopenharmony_civoid Context::OnRelayCooperation(const std::string &networkId, const NormalizedCoordinate &cursorPos)
319f857971dSopenharmony_ci{
320f857971dSopenharmony_ci    CHKPV(eventHandler_);
321f857971dSopenharmony_ci    FI_HILOGI("Notify observers of relay cooperation");
322f857971dSopenharmony_ci    for (const auto &observer : observers_) {
323f857971dSopenharmony_ci        eventHandler_->PostTask(
324f857971dSopenharmony_ci            [observer, networkId, cursorPos] {
325f857971dSopenharmony_ci                FI_HILOGI("Notify one observer of relay cooperation");
326f857971dSopenharmony_ci                CHKPV(observer);
327f857971dSopenharmony_ci                observer->OnRelay(networkId, cursorPos);
328f857971dSopenharmony_ci            });
329f857971dSopenharmony_ci    }
330f857971dSopenharmony_ci}
331f857971dSopenharmony_ci
332f857971dSopenharmony_civoid Context::CloseDistributedFileConnection(const std::string &remoteNetworkId)
333f857971dSopenharmony_ci{
334f857971dSopenharmony_ci    CHKPV(eventHandler_);
335f857971dSopenharmony_ci    FI_HILOGI("Notify observers of device offline");
336f857971dSopenharmony_ci    for (const auto &observer : observers_) {
337f857971dSopenharmony_ci        eventHandler_->PostTask(
338f857971dSopenharmony_ci            [observer, remoteNetworkId] {
339f857971dSopenharmony_ci                FI_HILOGI("Notify one observer of device offline, remoteNetworkId:%{public}s",
340f857971dSopenharmony_ci                    Utility::Anonymize(remoteNetworkId).c_str());
341f857971dSopenharmony_ci                CHKPV(observer);
342f857971dSopenharmony_ci                observer->CloseDistributedFileConnection(remoteNetworkId);
343f857971dSopenharmony_ci            });
344f857971dSopenharmony_ci    }
345f857971dSopenharmony_ci}
346f857971dSopenharmony_ci
347f857971dSopenharmony_civoid Context::OnResetCooperation()
348f857971dSopenharmony_ci{
349f857971dSopenharmony_ci    CHKPV(eventHandler_);
350f857971dSopenharmony_ci    FI_HILOGI("Notify observers of reset cooperation");
351f857971dSopenharmony_ci    for (const auto &observer : observers_) {
352f857971dSopenharmony_ci        eventHandler_->PostTask(
353f857971dSopenharmony_ci            [observer] {
354f857971dSopenharmony_ci                FI_HILOGI("Notify one observer of reset cooperation");
355f857971dSopenharmony_ci                CHKPV(observer);
356f857971dSopenharmony_ci                observer->OnReset();
357f857971dSopenharmony_ci            });
358f857971dSopenharmony_ci    }
359f857971dSopenharmony_ci}
360f857971dSopenharmony_ci
361f857971dSopenharmony_civoid Context::SetCursorPosition(const Coordinate &cursorPos)
362f857971dSopenharmony_ci{
363f857971dSopenharmony_ci    double xPercent = (PERCENT - std::clamp<double>(cursorPos.x, 0.0, PERCENT)) / PERCENT;
364f857971dSopenharmony_ci    double yPercent = std::clamp<double>(cursorPos.y, 0.0, PERCENT) / PERCENT;
365f857971dSopenharmony_ci
366f857971dSopenharmony_ci    auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
367f857971dSopenharmony_ci    CHKPV(display);
368f857971dSopenharmony_ci    cursorPos_.x = static_cast<int32_t>(xPercent * display->GetWidth());
369f857971dSopenharmony_ci    cursorPos_.y = static_cast<int32_t>(yPercent * display->GetHeight());
370f857971dSopenharmony_ci    env_->GetInput().SetPointerLocation(cursorPos_.x, cursorPos_.y);
371f857971dSopenharmony_ci    FI_HILOGI("Set cursor position (%{private}d,%{private}d)(%{private}d,%{private}d)(%{public}d,%{public}d)",
372f857971dSopenharmony_ci        cursorPos.x, cursorPos.y, cursorPos_.x, cursorPos_.y, display->GetWidth(), display->GetHeight());
373f857971dSopenharmony_ci}
374f857971dSopenharmony_ci
375f857971dSopenharmony_civoid Context::UpdateCursorPosition()
376f857971dSopenharmony_ci{
377f857971dSopenharmony_ci    env_->GetInput().SetPointerLocation(cursorPos_.x, cursorPos_.y);
378f857971dSopenharmony_ci    FI_HILOGI("Update cursor position (%{private}d,%{private}d)", cursorPos_.x, cursorPos_.y);
379f857971dSopenharmony_ci}
380f857971dSopenharmony_ci
381f857971dSopenharmony_civoid Context::ResetCursorPosition()
382f857971dSopenharmony_ci{
383f857971dSopenharmony_ci    constexpr Coordinate defaultCursorPos {
384f857971dSopenharmony_ci        .x = 50,
385f857971dSopenharmony_ci        .y = 50,
386f857971dSopenharmony_ci    };
387f857971dSopenharmony_ci    SetCursorPosition(defaultCursorPos);
388f857971dSopenharmony_ci}
389f857971dSopenharmony_ci
390f857971dSopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
391f857971dSopenharmony_civoid Context::StartTrace(const std::string &name)
392f857971dSopenharmony_ci{
393f857971dSopenharmony_ci    std::lock_guard guard { lock_ };
394f857971dSopenharmony_ci    if (traces_.find(name) != traces_.end()) {
395f857971dSopenharmony_ci        return;
396f857971dSopenharmony_ci    }
397f857971dSopenharmony_ci    traces_.emplace(name, std::chrono::steady_clock::now());
398f857971dSopenharmony_ci    FI_HILOGI("[PERF] Start tracing \'%{public}s\'", name.c_str());
399f857971dSopenharmony_ci}
400f857971dSopenharmony_ci
401f857971dSopenharmony_civoid Context::FinishTrace(const std::string &name)
402f857971dSopenharmony_ci{
403f857971dSopenharmony_ci    std::lock_guard guard { lock_ };
404f857971dSopenharmony_ci    if (auto iter = traces_.find(name); iter != traces_.end()) {
405f857971dSopenharmony_ci        FI_HILOGI("[PERF] Finish tracing \'%{public}s\', elapsed:%{public}lld ms", name.c_str(),
406f857971dSopenharmony_ci            std::chrono::duration_cast<std::chrono::milliseconds>(
407f857971dSopenharmony_ci                std::chrono::steady_clock::now() - iter->second).count());
408f857971dSopenharmony_ci        traces_.erase(iter);
409f857971dSopenharmony_ci    }
410f857971dSopenharmony_ci}
411f857971dSopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
412f857971dSopenharmony_ci
413f857971dSopenharmony_ci} // namespace Cooperate
414f857971dSopenharmony_ci} // namespace DeviceStatus
415f857971dSopenharmony_ci} // namespace Msdp
416f857971dSopenharmony_ci} // namespace OHOS
417