• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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_context.h"
17 
18 #include <algorithm>
19 
20 #include "display_manager.h"
21 #include "display_info.h"
22 #include "ddm_adapter.h"
23 #include "devicestatus_define.h"
24 #include "dsoftbus_handler.h"
25 #include "utility.h"
26 
27 #undef LOG_TAG
28 #define LOG_TAG "CooperateContext"
29 
30 namespace OHOS {
31 namespace Msdp {
32 namespace DeviceStatus {
33 namespace Cooperate {
34 namespace {
35 const std::string THREAD_NAME { "os_Cooperate_EventHandler" };
36 constexpr double PERCENT { 100.0 };
37 const int32_t MAX_MOUSE_SPEED { 20 };
38 } // namespace
39 
40 class BoardObserver final : public IBoardObserver {
41 public:
BoardObserver(Channel<CooperateEvent>::Sender sender)42     explicit BoardObserver(Channel<CooperateEvent>::Sender sender) : sender_(sender) {}
43     ~BoardObserver() = default;
44     DISALLOW_COPY_AND_MOVE(BoardObserver);
45 
OnBoardOnline(const std::string & networkId)46     void OnBoardOnline(const std::string &networkId) override
47     {
48         FI_HILOGD("\'%{public}s\' is online", Utility::Anonymize(networkId).c_str());
49         auto ret = sender_.Send(CooperateEvent(
50             CooperateEventType::DDM_BOARD_ONLINE,
51             DDMBoardOnlineEvent {
52                 .networkId = networkId
53             }));
54         if (ret != Channel<CooperateEvent>::NO_ERROR) {
55             FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
56         }
57     }
58 
OnBoardOffline(const std::string & networkId)59     void OnBoardOffline(const std::string &networkId) override
60     {
61         FI_HILOGD("\'%{public}s\' is offline", Utility::Anonymize(networkId).c_str());
62         auto ret = sender_.Send(CooperateEvent(
63             CooperateEventType::DDM_BOARD_OFFLINE,
64             DDMBoardOfflineEvent {
65                 .networkId = networkId
66             }));
67         if (ret != Channel<CooperateEvent>::NO_ERROR) {
68             FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
69         }
70     }
71 
72 private:
73     Channel<CooperateEvent>::Sender sender_;
74 };
75 
OnDeviceAdded(std::shared_ptr<IDevice> dev)76 void HotplugObserver::OnDeviceAdded(std::shared_ptr<IDevice> dev)
77 {
78     CHKPV(dev);
79     auto ret = sender_.Send(CooperateEvent(
80         CooperateEventType::INPUT_HOTPLUG_EVENT,
81         InputHotplugEvent {
82             .deviceId = dev->GetId(),
83             .type = InputHotplugType::PLUG,
84             .isKeyboard = dev->IsKeyboard(),
85         }));
86     if (ret != Channel<CooperateEvent>::NO_ERROR) {
87         FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
88     }
89 }
90 
OnDeviceRemoved(std::shared_ptr<IDevice> dev)91 void HotplugObserver::OnDeviceRemoved(std::shared_ptr<IDevice> dev)
92 {
93     CHKPV(dev);
94     auto ret = sender_.Send(CooperateEvent(
95         CooperateEventType::INPUT_HOTPLUG_EVENT,
96         InputHotplugEvent {
97             .deviceId = dev->GetId(),
98             .type = InputHotplugType::UNPLUG,
99             .isKeyboard = dev->IsKeyboard(),
100         }));
101     if (ret != Channel<CooperateEvent>::NO_ERROR) {
102         FI_HILOGE("Failed to send event via channel, error:%{public}d", ret);
103     }
104 }
105 
Context(IContext * env)106 Context::Context(IContext *env)
107     : dsoftbus_(env), eventMgr_(env), hotArea_(env), mouseLocation_(env), inputDevMgr_(env),
108       inputEventBuilder_(env), inputEventInterceptor_(env), env_(env)
109 {}
110 
AttachSender(Channel<CooperateEvent>::Sender sender)111 void Context::AttachSender(Channel<CooperateEvent>::Sender sender)
112 {
113     sender_ = sender;
114     dsoftbus_.AttachSender(sender);
115 }
116 
AddObserver(std::shared_ptr<ICooperateObserver> observer)117 void Context::AddObserver(std::shared_ptr<ICooperateObserver> observer)
118 {
119     CHKPV(observer);
120     observers_.insert(observer);
121 }
122 
RemoveObserver(std::shared_ptr<ICooperateObserver> observer)123 void Context::RemoveObserver(std::shared_ptr<ICooperateObserver> observer)
124 {
125     observers_.erase(observer);
126 }
127 
Enable()128 void Context::Enable()
129 {
130     CALL_DEBUG_ENTER;
131     StartEventHandler();
132     EnableDDM();
133     EnableDevMgr();
134     EnableInputDevMgr();
135 }
136 
Disable()137 void Context::Disable()
138 {
139     CALL_DEBUG_ENTER;
140     DisableDevMgr();
141     DisableDDM();
142     DisableInputDevMgr();
143     StopEventHandler();
144 }
145 
StartEventHandler()146 int32_t Context::StartEventHandler()
147 {
148     auto runner = AppExecFwk::EventRunner::Create(THREAD_NAME, AppExecFwk::ThreadMode::FFRT);
149     CHKPR(runner, RET_ERR);
150     eventHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
151     return RET_OK;
152 }
153 
StopEventHandler()154 void Context::StopEventHandler()
155 {
156     eventHandler_.reset();
157 }
158 
EnableDDM()159 void Context::EnableDDM()
160 {
161     boardObserver_ = std::make_shared<BoardObserver>(sender_);
162     CHKPV(env_);
163     env_->GetDDM().AddBoardObserver(boardObserver_);
164 }
165 
DisableDDM()166 void Context::DisableDDM()
167 {
168     CHKPV(env_);
169     env_->GetDDM().RemoveBoardObserver(boardObserver_);
170     boardObserver_.reset();
171 }
172 
EnableDevMgr()173 int32_t Context::EnableDevMgr()
174 {
175     hotplugObserver_ = std::make_shared<HotplugObserver>(sender_);
176     CHKPR(env_, RET_ERR);
177     env_->GetDeviceManager().AddDeviceObserver(hotplugObserver_);
178     return RET_OK;
179 }
180 
DisableDevMgr()181 void Context::DisableDevMgr()
182 {
183     CHKPV(env_);
184     env_->GetDeviceManager().RemoveDeviceObserver(hotplugObserver_);
185     hotplugObserver_.reset();
186 }
187 
EnableInputDevMgr()188 int32_t Context::EnableInputDevMgr()
189 {
190     inputDevMgr_.Enable(sender_);
191     return RET_OK;
192 }
193 
DisableInputDevMgr()194 void Context::DisableInputDevMgr()
195 {
196     inputDevMgr_.Disable();
197 }
198 
NormalizedCursorPosition() const199 NormalizedCoordinate Context::NormalizedCursorPosition() const
200 {
201     auto display = Rosen::DisplayManager::GetInstance().GetDisplayById(currentDisplayId_);
202     if (display == nullptr) {
203         FI_HILOGE("No default display");
204         return { 0, 0 };
205     }
206     Rectangle displayRect {
207         .width = display->GetWidth(),
208         .height = display->GetHeight(),
209     };
210     if ((displayRect.width <= 0) || (displayRect.height <= 0)) {
211         FI_HILOGE("Invalid display information");
212         return { 0, 0 };
213     }
214     return NormalizedCoordinate {
215         .x = static_cast<int32_t>((cursorPos_.x + 1) * PERCENT / displayRect.width),
216         .y = static_cast<int32_t>((cursorPos_.y + 1) * PERCENT / displayRect.height),
217     };
218 }
219 
EnableCooperate(const EnableCooperateEvent & event)220 void Context::EnableCooperate(const EnableCooperateEvent &event)
221 {
222 }
223 
DisableCooperate(const DisableCooperateEvent & event)224 void Context::DisableCooperate(const DisableCooperateEvent &event)
225 {
226     priv_ = 0;
227 }
228 
ResetPriv()229 void Context::ResetPriv()
230 {
231     priv_ = 0;
232 }
233 
StartCooperate(const StartCooperateEvent & event)234 void Context::StartCooperate(const StartCooperateEvent &event)
235 {
236     remoteNetworkId_ = event.remoteNetworkId;
237     startDeviceId_ = event.startDeviceId;
238     priv_ = 0;
239 }
240 
OnPointerEvent(const InputPointerEvent & event)241 void Context::OnPointerEvent(const InputPointerEvent &event)
242 {
243     if ((event.sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE) &&
244         ((event.pointerAction == MMI::PointerEvent::POINTER_ACTION_MOVE) ||
245          (event.pointerAction == MMI::PointerEvent::POINTER_ACTION_PULL_MOVE))) {
246         cursorPos_ = event.position;
247         currentDisplayId_ = event.currentDisplayId == -1 ? 0 : event.currentDisplayId;
248     }
249 }
250 
RemoteStartSuccess(const DSoftbusStartCooperateFinished & event)251 void Context::RemoteStartSuccess(const DSoftbusStartCooperateFinished &event)
252 {
253     remoteNetworkId_ = event.originNetworkId;
254     flag_ = event.extra.flag;
255     priv_ = event.extra.priv;
256     SetCursorPosition(event.cursorPos);
257 }
258 
StartCooperateWithOptions(const StartWithOptionsEvent & event)259 void Context::StartCooperateWithOptions(const StartWithOptionsEvent &event)
260 {
261     remoteNetworkId_ = event.remoteNetworkId;
262     startDeviceId_ = event.startDeviceId;
263     priv_ = 0;
264     cooperateOptions_ = {
265         event.displayX,
266         event.displayY,
267         event.displayId
268     };
269 }
270 
UpdateCooperateOptions(const StartWithOptionsEvent & event)271 void Context::UpdateCooperateOptions(const StartWithOptionsEvent &event)
272 {
273     cooperateOptions_ = {
274         event.displayX,
275         event.displayY,
276         event.displayId
277     };
278 }
279 
OnRemoteStart(const DSoftbusCooperateWithOptionsFinished & event)280 void Context::OnRemoteStart(const DSoftbusCooperateWithOptionsFinished &event)
281 {
282     remoteNetworkId_ = event.originNetworkId;
283     flag_ = event.extra.flag;
284     priv_ = event.extra.priv;
285     CHKPV(env_);
286     env_->GetInput().SetPointerLocation(event.cooperateOptions.displayX, event.cooperateOptions.displayY,
287         event.cooperateOptions.displayId);
288     FI_HILOGI("Set pointer location: %{private}d, %{private}d, %{private}d",
289         event.cooperateOptions.displayX, event.cooperateOptions.displayY, event.cooperateOptions.displayId);
290     cooperateOptions_ = {
291         event.cooperateOptions.displayX,
292         event.cooperateOptions.displayY,
293         event.cooperateOptions.displayId,
294     };
295 }
296 
AdjustPointerPos(DSoftbusCooperateOptions & dSoftbusCooperateOptions)297 void Context::AdjustPointerPos(DSoftbusCooperateOptions& dSoftbusCooperateOptions)
298 {
299     auto displayId = dSoftbusCooperateOptions.cooperateOptions.displayId;
300     auto& displayX = dSoftbusCooperateOptions.cooperateOptions.displayX;
301     auto& displayY = dSoftbusCooperateOptions.cooperateOptions.displayY;
302     FI_HILOGI("Start cooperate finish,displayX:%{private}d,displayY:%{private}d,displayId:%{public}d",
303         displayX, displayY, displayId);
304 #ifndef OHOS_BUILD_PC_PRODUCT
305     auto display = Rosen::DisplayManager::GetInstance().GetDisplayById(displayId);
306 #else
307     sptr<Rosen::DisplayInfo> display =
308         Rosen::DisplayManager::GetInstance().GetVisibleAreaDisplayInfoById(displayId);
309 #endif // OHOS_BUILD_PC_PRODUCT
310     if (display == nullptr) {
311         FI_HILOGE("No default display");
312         return;
313     }
314     Rectangle displayRect {
315         .width = display->GetWidth(),
316         .height = display->GetHeight(),
317     };
318     if (displayX <= 0) {
319         displayX = 0;
320     }
321     if (displayX >= displayRect.width) {
322         displayX = displayRect.width - 1;
323     }
324     if (displayY <= 0) {
325         displayY = 0;
326     }
327     if (displayY >= displayRect.height) {
328         displayY = displayRect.height - 1;
329     }
330     FI_HILOGI("adjust pointer position finish,displayX:%{private}d,displayY:%{private}d",
331         displayX, displayY);
332 }
333 
RelayCooperate(const DSoftbusRelayCooperate & event)334 void Context::RelayCooperate(const DSoftbusRelayCooperate &event)
335 {
336     remoteNetworkId_ = event.targetNetworkId;
337 }
338 
UpdateCooperateFlag(const UpdateCooperateFlagEvent & event)339 void Context::UpdateCooperateFlag(const UpdateCooperateFlagEvent &event)
340 {
341     flag_ = ((flag_ & ~event.mask) | (event.flag & event.mask));
342 }
343 
IsAllowCooperate()344 bool Context::IsAllowCooperate()
345 {
346     FI_HILOGI("Notify observers of allow cooperate");
347     return std::all_of(observers_.cbegin(), observers_.cend(), [](const auto &observer) {
348         return observer->IsAllowCooperate();
349     });
350 }
351 
OnStartCooperate(StartCooperateData & data)352 void Context::OnStartCooperate(StartCooperateData &data)
353 {
354     std::for_each(observers_.cbegin(), observers_.cend(), [&data](const auto &observer) {
355         return observer->OnStartCooperate(data);
356     });
357 }
358 
OnRemoteStartCooperate(RemoteStartCooperateData & data)359 void Context::OnRemoteStartCooperate(RemoteStartCooperateData &data)
360 {
361     std::for_each(observers_.cbegin(), observers_.cend(), [&data](const auto &observer) {
362         return observer->OnRemoteStartCooperate(data);
363     });
364 }
365 
OnStopCooperate()366 void Context::OnStopCooperate()
367 {
368     CHKPV(eventHandler_);
369     FI_HILOGI("Notify observers of stop cooperate");
370     for (const auto &observer : observers_) {
371         eventHandler_->PostTask(
372             [observer, remoteNetworkId = Peer()] {
373                 FI_HILOGI("Notify observer of stop cooperate");
374                 CHKPV(observer);
375                 observer->OnStopCooperate(remoteNetworkId);
376         });
377     }
378 }
379 
OnTransitionOut()380 void Context::OnTransitionOut()
381 {
382     CHKPV(eventHandler_);
383     FI_HILOGI("Notify observers of transition out");
384     CooperateInfo cooperateInfo = { NormalizedCursorPosition(), cooperateOptions_ };
385     for (const auto &observer : observers_) {
386         eventHandler_->PostTask(
387             [observer, remoteNetworkId = Peer(), cooperateInfo] {
388                 FI_HILOGI("Notify one observer of transition out");
389                 CHKPV(observer);
390                 observer->OnTransitionOut(remoteNetworkId, cooperateInfo);
391             });
392     }
393 }
394 
OnTransitionIn()395 void Context::OnTransitionIn()
396 {
397     StoreOriginPointerSpeed();
398     SetPointerSpeed(peerPointerSpeed_);
399     StoreOriginTouchPadSpeed();
400     SetTouchPadSpeed(peerTouchPadSpeed_);
401     CHKPV(eventHandler_);
402     FI_HILOGI("Notify observers of transition in");
403     CooperateInfo cooperateInfo = { NormalizedCursorPosition(), cooperateOptions_ };
404     for (const auto &observer : observers_) {
405         eventHandler_->PostTask(
406             [observer, remoteNetworkId = Peer(), cooperateInfo] {
407                 FI_HILOGI("Notify one observer of transition in");
408                 CHKPV(observer);
409                 observer->OnTransitionIn(remoteNetworkId, cooperateInfo);
410             });
411     }
412 }
413 
OnBack()414 void Context::OnBack()
415 {
416     SetPointerSpeed(originPointerSpeed_);
417     ClearPeerPointerSpeed();
418     SetTouchPadSpeed(originTouchPadSpeed_);
419     ClearPeerTouchPadSpeed();
420     CHKPV(eventHandler_);
421     FI_HILOGI("Notify observers of come back");
422     CooperateInfo cooperateInfo = { NormalizedCursorPosition(), cooperateOptions_ };
423     for (const auto &observer : observers_) {
424         eventHandler_->PostTask(
425             [observer, remoteNetworkId = Peer(), cooperateInfo] {
426                 FI_HILOGI("Notify one observer of come back");
427                 CHKPV(observer);
428                 observer->OnBack(remoteNetworkId, cooperateInfo);
429             });
430     }
431 }
432 
OnRelayCooperation(const std::string & networkId,const NormalizedCoordinate & cursorPos)433 void Context::OnRelayCooperation(const std::string &networkId, const NormalizedCoordinate &cursorPos)
434 {
435     CHKPV(eventHandler_);
436     FI_HILOGI("Notify observers of relay cooperation");
437     CooperateInfo cooperateInfo = { NormalizedCursorPosition(), cooperateOptions_ };
438     for (const auto &observer : observers_) {
439         eventHandler_->PostTask(
440             [observer, networkId, cooperateInfo] {
441                 FI_HILOGI("Notify one observer of relay cooperation");
442                 CHKPV(observer);
443                 observer->OnRelay(networkId, cooperateInfo);
444             });
445     }
446 }
447 
CloseDistributedFileConnection(const std::string & remoteNetworkId)448 void Context::CloseDistributedFileConnection(const std::string &remoteNetworkId)
449 {
450     CHKPV(eventHandler_);
451     FI_HILOGI("Notify observers of device offline");
452     for (const auto &observer : observers_) {
453         eventHandler_->PostTask(
454             [observer, remoteNetworkId] {
455                 FI_HILOGI("Notify one observer of device offline, remoteNetworkId:%{public}s",
456                     Utility::Anonymize(remoteNetworkId).c_str());
457                 CHKPV(observer);
458                 observer->CloseDistributedFileConnection(remoteNetworkId);
459             });
460     }
461 }
462 
StorePeerPointerSpeed(int32_t speed)463 void Context::StorePeerPointerSpeed(int32_t speed)
464 {
465     CALL_INFO_TRACE;
466     peerPointerSpeed_ = speed;
467 }
468 
ClearPeerPointerSpeed()469 void Context::ClearPeerPointerSpeed()
470 {
471     CALL_INFO_TRACE;
472     peerPointerSpeed_ = -1;
473 }
474 
StoreOriginPointerSpeed()475 void Context::StoreOriginPointerSpeed()
476 {
477     CALL_INFO_TRACE;
478     originPointerSpeed_ = GetPointerSpeed();
479 }
480 
StorePeerTouchPadSpeed(int32_t speed)481 void Context::StorePeerTouchPadSpeed(int32_t speed)
482 {
483     CALL_INFO_TRACE;
484     peerTouchPadSpeed_ = speed;
485 }
486 
ClearPeerTouchPadSpeed()487 void Context::ClearPeerTouchPadSpeed()
488 {
489     CALL_INFO_TRACE;
490     peerTouchPadSpeed_ = -1;
491 }
492 
StoreOriginTouchPadSpeed()493 void Context::StoreOriginTouchPadSpeed()
494 {
495     CALL_INFO_TRACE;
496     originTouchPadSpeed_ = GetTouchPadSpeed();
497 }
498 
OnResetCooperation()499 void Context::OnResetCooperation()
500 {
501     SetPointerSpeed(originPointerSpeed_);
502     ClearPeerPointerSpeed();
503     SetTouchPadSpeed(originTouchPadSpeed_);
504     ClearPeerTouchPadSpeed();
505     priv_ = 0;
506     CHKPV(eventHandler_);
507     FI_HILOGI("Notify observers of reset cooperation");
508     for (const auto &observer : observers_) {
509         eventHandler_->PostTask(
510             [observer] {
511                 FI_HILOGI("Notify one observer of reset cooperation");
512                 CHKPV(observer);
513                 observer->OnReset();
514             });
515     }
516 }
517 
SetCursorPosition(const Coordinate & cursorPos)518 void Context::SetCursorPosition(const Coordinate &cursorPos)
519 {
520     auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
521     CHKPV(display);
522     auto cursor = GetCursorPos(cursorPos);
523     cursorPos_ = cursor;
524     CHKPV(env_);
525     env_->GetInput().SetPointerLocation(cursor.x, cursor.y);
526     FI_HILOGI("Set cursor position (%{private}d,%{private}d)(%{private}d,%{private}d)(%{public}d,%{public}d)",
527         cursorPos.x, cursorPos.y, cursor.x, cursor.y, display->GetWidth(), display->GetHeight());
528 }
529 
StopCooperateSetCursorPosition(const Coordinate & cursorPos)530 void Context::StopCooperateSetCursorPosition(const Coordinate &cursorPos)
531 {
532     auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
533     CHKPV(display);
534     int32_t displayId = static_cast<int32_t>(display->GetId());
535     if (displayId < 0) {
536         displayId = 0;
537     }
538     auto cursor = GetCursorPos(cursorPos);
539     CHKPV(env_);
540     env_->GetInput().SetPointerLocation(cursor.x, cursor.y, displayId);
541     FI_HILOGI("Set cursor position (%{private}d,%{private}d)(%{private}d,%{private}d)(%{public}d,%{public}d),"
542         "dafault display id is %{public}d", cursorPos.x, cursorPos.y, cursor.x, cursor.y,
543         display->GetWidth(), display->GetHeight(), displayId);
544 }
545 
GetCursorPos(const Coordinate & cursorPos)546 Coordinate Context::GetCursorPos(const Coordinate &cursorPos)
547 {
548     double xPercent = (PERCENT - std::clamp<double>(cursorPos.x, 0.0, PERCENT)) / PERCENT;
549     double yPercent = std::clamp<double>(cursorPos.y, 0.0, PERCENT) / PERCENT;
550 
551     auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
552     if (display == nullptr) {
553         FI_HILOGE("No default display");
554         return cursorPos_;
555     }
556     int32_t displayId = static_cast<int32_t>(display->GetId());
557     if (displayId < 0) {
558         displayId = 0;
559     }
560     return Coordinate {
561         .x = static_cast<int32_t>(xPercent * display->GetWidth()),
562         .y = static_cast<int32_t>(yPercent * display->GetHeight()),
563     };
564 }
565 
UpdateCursorPosition()566 void Context::UpdateCursorPosition()
567 {
568     CHKPV(env_);
569     env_->GetInput().SetPointerLocation(cursorPos_.x, cursorPos_.y);
570     FI_HILOGI("Update cursor position (%{private}d,%{private}d)", cursorPos_.x, cursorPos_.y);
571 }
572 
GetPointerSpeed()573 int32_t Context::GetPointerSpeed()
574 {
575     int32_t speed { -1 };
576     CHKPR(env_, RET_ERR);
577     env_->GetInput().GetPointerSpeed(speed);
578     FI_HILOGI("Current pointer speed:%{public}d", speed);
579     return speed;
580 }
581 
SetPointerSpeed(int32_t speed)582 void Context::SetPointerSpeed(int32_t speed)
583 {
584     CHKPV(env_);
585     env_->GetInput().SetPointerSpeed(speed);
586     FI_HILOGI("Current pointer speed:%{public}d", speed);
587 }
588 
GetTouchPadSpeed()589 int32_t Context::GetTouchPadSpeed()
590 {
591     int32_t speed { -1 };
592     CHKPR(env_, RET_ERR);
593     env_->GetInput().GetTouchPadSpeed(speed);
594     FI_HILOGI("Current touchPad speed:%{public}d", speed);
595     return speed;
596 }
597 
SetTouchPadSpeed(int32_t speed)598 void Context::SetTouchPadSpeed(int32_t speed)
599 {
600     if (speed > MAX_MOUSE_SPEED) {
601         FI_HILOGE("speed is :%{public}d", speed);
602         return;
603     }
604     CHKPV(env_);
605     env_->GetInput().SetTouchPadSpeed(speed);
606     FI_HILOGI("Current touchPad speed:%{public}d", speed);
607 }
608 
ResetCursorPosition()609 void Context::ResetCursorPosition()
610 {
611     constexpr Coordinate defaultCursorPos {
612         .x = 50,
613         .y = 50,
614     };
615     StopCooperateSetCursorPosition(defaultCursorPos);
616 }
617 
SetVirtualTrackpadDeviceId(int32_t deviceId)618 void Context::SetVirtualTrackpadDeviceId(int32_t deviceId)
619 {
620     VirtualTrackpadDeviceId_ = deviceId;
621     FI_HILOGI("Cur vir track pad:%{public}d", deviceId);
622 }
623 
GetVirtualTrackpadDeviceId()624 int32_t Context::GetVirtualTrackpadDeviceId()
625 {
626     return VirtualTrackpadDeviceId_;
627 }
628 
ResetVirtualTrackpadDeviceId()629 void Context::ResetVirtualTrackpadDeviceId()
630 {
631     VirtualTrackpadDeviceId_ = -1;
632 }
633 
634 #ifdef ENABLE_PERFORMANCE_CHECK
StartTrace(const std::string & name)635 void Context::StartTrace(const std::string &name)
636 {
637     std::lock_guard guard { lock_ };
638     if (traces_.find(name) != traces_.end()) {
639         return;
640     }
641     traces_.emplace(name, std::chrono::steady_clock::now());
642     FI_HILOGI("[PERF] Start tracing \'%{public}s\'", name.c_str());
643 }
644 
FinishTrace(const std::string & name)645 void Context::FinishTrace(const std::string &name)
646 {
647     std::lock_guard guard { lock_ };
648     if (auto iter = traces_.find(name); iter != traces_.end()) {
649         FI_HILOGI("[PERF] Finish tracing \'%{public}s\', elapsed:%{public}lld ms", name.c_str(),
650             std::chrono::duration_cast<std::chrono::milliseconds>(
651                 std::chrono::steady_clock::now() - iter->second).count());
652         traces_.erase(iter);
653     }
654 }
655 #endif // ENABLE_PERFORMANCE_CHECK
656 
657 } // namespace Cooperate
658 } // namespace DeviceStatus
659 } // namespace Msdp
660 } // namespace OHOS
661