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