From 8fa0469c1699638b71c28ddd33fb015d14d5c8d6 Mon Sep 17 00:00:00 2001 From: blueyouth Date: Tue, 22 Apr 2025 21:43:25 +0800 Subject: [PATCH] touch tracking Signed-off-by: blueyouth Change-Id: Ic8144cecac3436476cc136bbf402c74eb56d3dda --- .../include/input_manager_impl.h | 1 + .../event_handler/src/input_manager_impl.cpp | 10 ++++ frameworks/proxy/events/src/input_manager.cpp | 5 ++ .../proxy/events/test/input_manager_test.cpp | 24 +++++++++ .../innerkits/proxy/include/input_manager.h | 2 + .../include/i_multimodal_input_connect.h | 1 + .../multimodal_input_connect_manager.h | 1 + .../include/multimodal_input_connect_proxy.h | 1 + .../include/multimodal_input_connect_stub.h | 1 + .../multimodalinput_ipc_interface_code.h | 1 + .../src/multimodal_input_connect_manager.cpp | 7 +++ .../src/multimodal_input_connect_proxy.cpp | 22 ++++++++ .../src/multimodal_input_connect_stub.cpp | 19 +++++++ .../test/mock_multimodal_input_connect_stub.h | 2 +- .../multimodal_input_connect_stub_ex_test.cpp | 1 + .../include/server_msg_handler.h | 1 + .../message_handle/src/server_msg_handler.cpp | 10 ++++ service/module_loader/include/mmi_service.h | 3 ++ service/module_loader/src/mmi_service.cpp | 38 ++++++++++++++ .../include/i_input_windows_manager.h | 1 + .../include/input_windows_manager.h | 4 ++ .../src/input_windows_manager.cpp | 50 ++++++++++++++++++- .../mock/include/input_windows_manager_mock.h | 1 + util/common/include/error_multimodal.h | 2 + 24 files changed, 206 insertions(+), 2 deletions(-) diff --git a/frameworks/proxy/event_handler/include/input_manager_impl.h b/frameworks/proxy/event_handler/include/input_manager_impl.h index 30495e197..5ce43e89d 100644 --- a/frameworks/proxy/event_handler/include/input_manager_impl.h +++ b/frameworks/proxy/event_handler/include/input_manager_impl.h @@ -242,6 +242,7 @@ public: int32_t ShiftAppPointerEvent(const ShiftWindowParam ¶m, bool autoGenDown); int32_t CheckKnuckleEvent(float pointX, float pointY, bool &touchType); int32_t LaunchAiScreenAbility(); + int32_t SwitchTouchTracking(bool touchTracking); private: int32_t PackWindowInfo(NetPacket &pkt, DisplayGroupInfo &displayGroupInfo); diff --git a/frameworks/proxy/event_handler/src/input_manager_impl.cpp b/frameworks/proxy/event_handler/src/input_manager_impl.cpp index a6feaee7e..d699f0025 100644 --- a/frameworks/proxy/event_handler/src/input_manager_impl.cpp +++ b/frameworks/proxy/event_handler/src/input_manager_impl.cpp @@ -2821,5 +2821,15 @@ int32_t InputManagerImpl::LaunchAiScreenAbility() CALL_INFO_TRACE; return MULTIMODAL_INPUT_CONNECT_MGR->LaunchAiScreenAbility(); } + +int32_t InputManagerImpl::SwitchTouchTracking(bool touchTracking) +{ + CALL_INFO_TRACE; + if ((PRODUCT_TYPE != "phone") && (PRODUCT_TYPE != "tablet")) { + MMI_HILOGW("Does not support touch-tracking on %{public}s", PRODUCT_TYPE.c_str()); + return CAPABILITY_NOT_SUPPORTED; + } + return MULTIMODAL_INPUT_CONNECT_MGR->SwitchTouchTracking(touchTracking); +} } // namespace MMI } // namespace OHOS \ No newline at end of file diff --git a/frameworks/proxy/events/src/input_manager.cpp b/frameworks/proxy/events/src/input_manager.cpp index f5c64b350..ba3a48a42 100644 --- a/frameworks/proxy/events/src/input_manager.cpp +++ b/frameworks/proxy/events/src/input_manager.cpp @@ -913,5 +913,10 @@ int32_t InputManager::LaunchAiScreenAbility() { return InputMgrImpl.LaunchAiScreenAbility(); } + +int32_t InputManager::SwitchTouchTracking(bool touchTracking) +{ + return InputMgrImpl.SwitchTouchTracking(touchTracking); +} } // namespace MMI } // namespace OHOS diff --git a/frameworks/proxy/events/test/input_manager_test.cpp b/frameworks/proxy/events/test/input_manager_test.cpp index a9aba5fd4..306632da9 100644 --- a/frameworks/proxy/events/test/input_manager_test.cpp +++ b/frameworks/proxy/events/test/input_manager_test.cpp @@ -5682,5 +5682,29 @@ HWTEST_F(InputManagerTest, InputManagerTest_SetKnuckleSwitch_001, TestSize.Level std::shared_ptr inputManager = std::make_shared(); ASSERT_NO_FATAL_FAILURE(inputManager->SetKnuckleSwitch(knuckleSwitch)); } + +/* + * @tc.name: InputManagerTest_SwitchTouchTracking_001 + * @tc.desc: SwitchTouchTracking + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(InputManagerTest, InputManagerTest_SwitchTouchTracking_001, TestSize.Level1) +{ + CALL_TEST_DEBUG; + ASSERT_NO_FATAL_FAILURE(InputManager::GetInstance()->SwitchTouchTracking(true)); +} + +/* + * @tc.name: InputManagerTest_SwitchTouchTracking_002 + * @tc.desc: SwitchTouchTracking + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(InputManagerTest, InputManagerTest_SwitchTouchTracking_002, TestSize.Level1) +{ + CALL_TEST_DEBUG; + ASSERT_NO_FATAL_FAILURE(InputManager::GetInstance()->SwitchTouchTracking(false)); +} } // namespace MMI } // namespace OHOS diff --git a/interfaces/native/innerkits/proxy/include/input_manager.h b/interfaces/native/innerkits/proxy/include/input_manager.h index 6fb604a42..aa81cbd03 100644 --- a/interfaces/native/innerkits/proxy/include/input_manager.h +++ b/interfaces/native/innerkits/proxy/include/input_manager.h @@ -1173,6 +1173,8 @@ public: */ int32_t LaunchAiScreenAbility(); + int32_t SwitchTouchTracking(bool touchTracking); + private: InputManager() = default; DISALLOW_COPY_AND_MOVE(InputManager); diff --git a/service/connect_manager/include/i_multimodal_input_connect.h b/service/connect_manager/include/i_multimodal_input_connect.h index 842174206..201ecf4d7 100644 --- a/service/connect_manager/include/i_multimodal_input_connect.h +++ b/service/connect_manager/include/i_multimodal_input_connect.h @@ -187,6 +187,7 @@ public: virtual int32_t SetMultiWindowScreenId(uint64_t screenId, uint64_t displayNodeScreenId) = 0; virtual int32_t SetKnuckleSwitch(bool knuckleSwitch) = 0; virtual int32_t LaunchAiScreenAbility() = 0; + virtual int32_t SwitchTouchTracking(bool touchTracking) = 0; }; } // namespace MMI } // namespace OHOS diff --git a/service/connect_manager/include/multimodal_input_connect_manager.h b/service/connect_manager/include/multimodal_input_connect_manager.h index dfecf926e..21bc95fd7 100644 --- a/service/connect_manager/include/multimodal_input_connect_manager.h +++ b/service/connect_manager/include/multimodal_input_connect_manager.h @@ -175,6 +175,7 @@ public: int32_t SetMultiWindowScreenId(uint64_t screenId, uint64_t displayNodeScreenId); int32_t SetKnuckleSwitch(bool knuckleSwitch); int32_t LaunchAiScreenAbility(); + int32_t SwitchTouchTracking(bool touchTracking); private: MultimodalInputConnectManager() = default; diff --git a/service/connect_manager/include/multimodal_input_connect_proxy.h b/service/connect_manager/include/multimodal_input_connect_proxy.h index dfecb7f25..3469054c7 100644 --- a/service/connect_manager/include/multimodal_input_connect_proxy.h +++ b/service/connect_manager/include/multimodal_input_connect_proxy.h @@ -173,6 +173,7 @@ public: int32_t SetMultiWindowScreenId(uint64_t screenId, uint64_t displayNodeScreenId) override; int32_t SetKnuckleSwitch(bool knuckleSwitch) override; int32_t LaunchAiScreenAbility() override; + int32_t SwitchTouchTracking(bool touchTracking) override; private: static inline BrokerDelegator delegator_; diff --git a/service/connect_manager/include/multimodal_input_connect_stub.h b/service/connect_manager/include/multimodal_input_connect_stub.h index 934e48326..37062c2fc 100644 --- a/service/connect_manager/include/multimodal_input_connect_stub.h +++ b/service/connect_manager/include/multimodal_input_connect_stub.h @@ -187,6 +187,7 @@ protected: int32_t StubSetMultiWindowScreenId(MessageParcel& data, MessageParcel& reply); int32_t StubSetKnuckleSwitch(MessageParcel& data, MessageParcel& reply); int32_t StubLaunchAiScreenAbility(MessageParcel& data, MessageParcel& reply); + int32_t StubSwitchTouchTracking(MessageParcel& data, MessageParcel& reply); private: int32_t VerifyTouchPadSetting(void); diff --git a/service/connect_manager/include/multimodalinput_ipc_interface_code.h b/service/connect_manager/include/multimodalinput_ipc_interface_code.h index 01bb07fbc..d846ef538 100644 --- a/service/connect_manager/include/multimodalinput_ipc_interface_code.h +++ b/service/connect_manager/include/multimodalinput_ipc_interface_code.h @@ -161,6 +161,7 @@ enum class MultimodalinputConnectInterfaceCode { UNSUBSCRIBE_KEY_MONITOR = 352, #endif // OHOS_BUILD_ENABLE_KEY_PRESSED_HANDLER QUERY_SWITCH_STATE_EVENT = 353, + SWITCH_TOUCH_TRACKING, }; enum class MultimodalinputEventObserverCode { diff --git a/service/connect_manager/src/multimodal_input_connect_manager.cpp b/service/connect_manager/src/multimodal_input_connect_manager.cpp index 6ebcc3e50..077cf1b9a 100644 --- a/service/connect_manager/src/multimodal_input_connect_manager.cpp +++ b/service/connect_manager/src/multimodal_input_connect_manager.cpp @@ -1073,5 +1073,12 @@ int32_t MultimodalInputConnectManager::LaunchAiScreenAbility() CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID); return multimodalInputConnectService_->LaunchAiScreenAbility(); } + +int32_t MultimodalInputConnectManager::SwitchTouchTracking(bool touchTracking) +{ + std::lock_guard guard(lock_); + CHKPR(multimodalInputConnectService_, INVALID_HANDLER_ID); + return multimodalInputConnectService_->SwitchTouchTracking(touchTracking); +} } // namespace MMI } // namespace OHOS diff --git a/service/connect_manager/src/multimodal_input_connect_proxy.cpp b/service/connect_manager/src/multimodal_input_connect_proxy.cpp index eb0e6cf22..169fe1c9b 100644 --- a/service/connect_manager/src/multimodal_input_connect_proxy.cpp +++ b/service/connect_manager/src/multimodal_input_connect_proxy.cpp @@ -3051,5 +3051,27 @@ int32_t MultimodalInputConnectProxy::LaunchAiScreenAbility() } return ret; } + +int32_t MultimodalInputConnectProxy::SwitchTouchTracking(bool touchTracking) +{ + CALL_DEBUG_ENTER; + MessageParcel data; + if (!data.WriteInterfaceToken(MultimodalInputConnectProxy::GetDescriptor())) { + MMI_HILOGE("Failed to write descriptor"); + return ERR_INVALID_VALUE; + } + WRITEBOOL(data, touchTracking, ERR_INVALID_VALUE); + MessageParcel reply; + MessageOption option; + sptr remote = Remote(); + CHKPR(remote, RET_ERR); + auto ret = remote->SendRequest( + static_cast(MultimodalinputConnectInterfaceCode::SWITCH_TOUCH_TRACKING), + data, reply, option); + if (ret != RET_OK) { + MMI_HILOGE("Send request failed, ret:%{public}d", ret); + } + return ret; +} } // namespace MMI } // namespace OHOS diff --git a/service/connect_manager/src/multimodal_input_connect_stub.cpp b/service/connect_manager/src/multimodal_input_connect_stub.cpp index e9aacfae9..9a8bbbc85 100644 --- a/service/connect_manager/src/multimodal_input_connect_stub.cpp +++ b/service/connect_manager/src/multimodal_input_connect_stub.cpp @@ -510,6 +510,9 @@ int32_t MultimodalInputConnectStub::OnRemoteRequest(uint32_t code, MessageParcel case static_cast(MultimodalinputConnectInterfaceCode::QUERY_SWITCH_STATE_EVENT): ret = StubQuerySwitchStatus(data, reply); break; + case static_cast(MultimodalinputConnectInterfaceCode::SWITCH_TOUCH_TRACKING): + ret = StubSwitchTouchTracking(data, reply); + break; default: { MMI_HILOGE("Unknown code:%{public}u, go switch default", code); ret = IPCObjectStub::OnRemoteRequest(code, data, reply, option); @@ -3515,5 +3518,21 @@ int32_t MultimodalInputConnectStub::StubLaunchAiScreenAbility(MessageParcel& dat } return RET_OK; } + +int32_t MultimodalInputConnectStub::StubSwitchTouchTracking(MessageParcel& data, MessageParcel& reply) +{ + CALL_DEBUG_ENTER; + constexpr int32_t rootUid { 0 }; + constexpr int32_t accessibilityUid { 1103 }; + int32_t callingUid = GetCallingUid(); + if (((callingUid != rootUid) && (callingUid != accessibilityUid)) || !PER_HELPER->VerifySystemApp()) { + MMI_HILOGE("Verify system APP failed"); + return PERMISSION_DENIED; + } + bool touchTracking { false }; + READBOOL(data, touchTracking, IPC_PROXY_DEAD_OBJECT_ERR); + SwitchTouchTracking(touchTracking); + return RET_OK; +} } // namespace MMI } // namespace OHOS diff --git a/service/connect_manager/test/mock_multimodal_input_connect_stub.h b/service/connect_manager/test/mock_multimodal_input_connect_stub.h index f38287bc2..daae0e972 100644 --- a/service/connect_manager/test/mock_multimodal_input_connect_stub.h +++ b/service/connect_manager/test/mock_multimodal_input_connect_stub.h @@ -200,8 +200,8 @@ public: MOCK_METHOD(int32_t, SetKnuckleSwitch, (bool knuckleSwitch), (override)); MOCK_METHOD(int32_t, LaunchAiScreenAbility, (), (override)); MOCK_METHOD(bool, IsRunning, (), (const override)); + MOCK_METHOD(int32_t, SwitchTouchTracking, (bool touchTracking), (override)); }; - } // namespace MMI } // namespace OHOS #endif // MOCK_MULTIMODAL_INPUT_CONNECT_STUB_H diff --git a/service/connect_manager/test/multimodal_input_connect_stub_ex_test.cpp b/service/connect_manager/test/multimodal_input_connect_stub_ex_test.cpp index 66f5d09aa..166844a74 100644 --- a/service/connect_manager/test/multimodal_input_connect_stub_ex_test.cpp +++ b/service/connect_manager/test/multimodal_input_connect_stub_ex_test.cpp @@ -385,6 +385,7 @@ public: return static_cast(knuckleSwitch); }; int32_t LaunchAiScreenAbility() override { return RET_OK; } + int32_t SwitchTouchTracking(bool touchTracking) override { return RET_OK; } std::atomic state_ = ServiceRunningState::STATE_NOT_START; int32_t rows_ = 0; diff --git a/service/message_handle/include/server_msg_handler.h b/service/message_handle/include/server_msg_handler.h index 1b9e7fc14..18d6cbdf9 100644 --- a/service/message_handle/include/server_msg_handler.h +++ b/service/message_handle/include/server_msg_handler.h @@ -124,6 +124,7 @@ public: bool AddInjectNotice(const InjectNoticeInfo& noticeInfo); int32_t OnTransferBinderClientSrv(const sptr &binderClientObject, int32_t pid); int32_t RegisterWindowStateErrorCallback(SessionPtr sess, NetPacket &pkt); + int32_t SwitchTouchTracking(bool touchTracking); protected: int32_t OnRegisterMsgHandler(SessionPtr sess, NetPacket& pkt); diff --git a/service/message_handle/src/server_msg_handler.cpp b/service/message_handle/src/server_msg_handler.cpp index 0f092e665..847107ed5 100644 --- a/service/message_handle/src/server_msg_handler.cpp +++ b/service/message_handle/src/server_msg_handler.cpp @@ -878,6 +878,16 @@ int32_t ServerMsgHandler::RegisterWindowStateErrorCallback(SessionPtr sess, NetP return RET_OK; } +int32_t ServerMsgHandler::SwitchTouchTracking(bool touchTracking) +{ + if ((PRODUCT_TYPE != "phone") && (PRODUCT_TYPE != "tablet")) { + MMI_HILOGW("Does not support touch-tracking on %{public}s", PRODUCT_TYPE.c_str()); + return CAPABILITY_NOT_SUPPORTED; + } + WIN_MGR->SwitchTouchTracking(touchTracking); + return RET_OK; +} + #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT int32_t ServerMsgHandler::OnEnhanceConfig(SessionPtr sess, NetPacket &pkt) { diff --git a/service/module_loader/include/mmi_service.h b/service/module_loader/include/mmi_service.h index fc8100a6e..25e216201 100644 --- a/service/module_loader/include/mmi_service.h +++ b/service/module_loader/include/mmi_service.h @@ -157,6 +157,7 @@ public: void OnAddResSchedSystemAbility(int32_t systemAbilityId, const std::string &deviceId); #endif // OHOS_RSS_CLIENT void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; + void OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; int32_t HasIrEmitter(bool &hasIrEmitter) override; int32_t GetInfraredFrequencies(std::vector& frequencies) override; int32_t TransmitInfrared(int64_t number, std::vector& pattern) override; @@ -207,6 +208,7 @@ public: int32_t SetMultiWindowScreenIdInner(uint64_t screenId, uint64_t displayNodeScreenId); int32_t SetKnuckleSwitch(bool knuckleSwitch) override; int32_t LaunchAiScreenAbility() override; + int32_t SwitchTouchTracking(bool touchTracking) override; protected: void OnConnected(SessionPtr s) override; @@ -299,6 +301,7 @@ private: #if defined(OHOS_BUILD_ENABLE_TOUCH) && defined(OHOS_BUILD_ENABLE_MONITOR) void SetupTouchGestureHandler(); #endif // defined(OHOS_BUILD_ENABLE_TOUCH) && defined(OHOS_BUILD_ENABLE_MONITOR) + void OnRemoveAccessibility(); std::atomic state_ = ServiceRunningState::STATE_NOT_START; int32_t mmiFd_ { -1 }; diff --git a/service/module_loader/src/mmi_service.cpp b/service/module_loader/src/mmi_service.cpp index fa59185f0..258a8ef86 100644 --- a/service/module_loader/src/mmi_service.cpp +++ b/service/module_loader/src/mmi_service.cpp @@ -1876,6 +1876,13 @@ void MMIService::OnAddSystemAbility(int32_t systemAbilityId, const std::string & #endif // OHOS_BUILD_ENABLE_COMBINATION_KEY } +void MMIService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) +{ + if (systemAbilityId == ACCESSIBILITY_MANAGER_SERVICE_ID) { + OnRemoveAccessibility(); + } +} + #if defined(OHOS_BUILD_ENABLE_MONITOR) && defined(PLAYER_FRAMEWORK_EXISTS) void MMIService::ScreenCaptureCallback(int32_t pid, bool isStart) { @@ -3855,5 +3862,36 @@ int32_t MMIService::LaunchAiScreenAbility() } return ret; } + +int32_t MMIService::SwitchTouchTracking(bool touchTracking) +{ + if (touchTracking) { + if (!AddSystemAbilityListener(ACCESSIBILITY_MANAGER_SERVICE_ID)) { + MMI_HILOGE("AddSystemAbilityListener(%{public}d) fail", ACCESSIBILITY_MANAGER_SERVICE_ID); + } + } else { + if (!RemoveSystemAbilityListener(ACCESSIBILITY_MANAGER_SERVICE_ID)) { + MMI_HILOGE("RemoveSystemAbilityListener(%{public}d) fail", ACCESSIBILITY_MANAGER_SERVICE_ID); + } + } + auto ret = delegateTasks_.PostSyncTask([this, touchTracking] { + return sMsgHandler_.SwitchTouchTracking(touchTracking); + }); + if (ret != RET_OK) { + MMI_HILOGE("PostSyncTask-SwitchTouchTracking fail, error:%{public}d", ret); + } + return ret; +} + +void MMIService::OnRemoveAccessibility() +{ + auto ret = delegateTasks_.PostSyncTask([this] { + MMI_HILOGI("Reset touch-tracking on removal of Accessibility"); + return sMsgHandler_.SwitchTouchTracking(false); + }); + if (ret != RET_OK) { + MMI_HILOGE("PostSyncTask-SwitchTouchTracking fail, error:%{public}d", ret); + } +} } // namespace MMI } // namespace OHOS diff --git a/service/window_manager/include/i_input_windows_manager.h b/service/window_manager/include/i_input_windows_manager.h index 282bfa91a..a58da98c2 100644 --- a/service/window_manager/include/i_input_windows_manager.h +++ b/service/window_manager/include/i_input_windows_manager.h @@ -183,6 +183,7 @@ public: #endif // OHOS_BUILD_ENABLE_TOUCH virtual std::pair CalcDrawCoordinate(const DisplayInfo& displayInfo, PointerEvent::PointerItem pointerItem) = 0; + virtual void SwitchTouchTracking(bool touchTracking) = 0; static std::shared_ptr GetInstance(); static void DestroyInstance(); diff --git a/service/window_manager/include/input_windows_manager.h b/service/window_manager/include/input_windows_manager.h index 7ec4a844b..c7f281fd1 100644 --- a/service/window_manager/include/input_windows_manager.h +++ b/service/window_manager/include/input_windows_manager.h @@ -230,8 +230,11 @@ public: std::pair CalcDrawCoordinate(const DisplayInfo& displayInfo, PointerEvent::PointerItem pointerItem); #endif // OHOS_BUILD_ENABLE_TOUCH + void SwitchTouchTracking(bool touchTracking); private: + bool NeedTouchTracking(PointerEvent &event) const; + void ProcessTouchTracking(std::shared_ptr event, const WindowInfo &targetWindow); bool IgnoreTouchEvent(std::shared_ptr pointerEvent); void ReissueCancelTouchEvent(std::shared_ptr pointerEvent); int32_t GetDisplayId(std::shared_ptr inputEvent) const; @@ -524,6 +527,7 @@ private: #endif // OHOS_BUILD_ENABLE_TOUCH static std::unordered_map convertToolTypeMap_; bool IsFoldable_ { false }; + bool touchTracking_ { false }; int32_t timerId_ { -1 }; std::shared_ptr GetlastPointerEvent(); std::mutex mtx_; diff --git a/service/window_manager/src/input_windows_manager.cpp b/service/window_manager/src/input_windows_manager.cpp index a2e229c52..50a93b542 100644 --- a/service/window_manager/src/input_windows_manager.cpp +++ b/service/window_manager/src/input_windows_manager.cpp @@ -85,6 +85,7 @@ constexpr int32_t ANGLE_90 { 90 }; constexpr int32_t ANGLE_360 { 360 }; constexpr int32_t POINTER_MOVEFLAG = { 7 }; constexpr size_t POINTER_STYLE_WINDOW_NUM = { 10 }; +constexpr size_t SINGLE_TOUCH { 1 }; constexpr int32_t CAST_INPUT_DEVICEID { 0xAAAAAAFF }; constexpr int32_t CAST_SCREEN_DEVICEID { 0xAAAAAAFE }; constexpr int32_t DEFAULT_DPI { 0 }; @@ -4600,7 +4601,7 @@ int32_t InputWindowsManager::UpdateTouchScreenTarget(std::shared_ptr winMap; @@ -4776,6 +4777,7 @@ int32_t InputWindowsManager::UpdateTouchScreenTarget(std::shared_ptrSetTargetWindowId(touchWindow->id); pointerItem.SetTargetWindowId(touchWindow->id); #ifdef OHOS_BUILD_ENABLE_ANCO @@ -6714,5 +6716,51 @@ std::pair InputWindowsManager::CalcDrawCoordinate(const Displa } return {static_cast(physicalX), static_cast(physicalY)}; } + +void InputWindowsManager::SwitchTouchTracking(bool touchTracking) +{ + MMI_HILOGI("Switch touch tracking:%{public}d", touchTracking); + touchTracking_ = touchTracking; +} + +bool InputWindowsManager::NeedTouchTracking(PointerEvent &event) const +{ + if (!touchTracking_) { + return false; + } + if (event.HasFlag(InputEvent::EVENT_FLAG_ACCESSIBILITY)) { + return false; + } + if (event.GetPointerAction() != PointerEvent::POINTER_ACTION_MOVE) { + return false; + } + return (event.GetPointerCount() == SINGLE_TOUCH); +} + +void InputWindowsManager::ProcessTouchTracking(std::shared_ptr event, const WindowInfo &targetWindow) +{ + if (!NeedTouchTracking(*event)) { + return; + } + if (event->GetTargetWindowId() == targetWindow.id) { + return; + } + PointerEvent::PointerItem pointerItem {}; + if (!event->GetPointerItem(event->GetPointerId(), pointerItem)) { + MMI_HILOGE("Corrupted pointer event, No:%{public}d,PI:%{public}d", event->GetId(), event->GetPointerId()); + return; + } + pointerItem.SetPressed(false); + event->UpdatePointerItem(event->GetPointerId(), pointerItem); + event->SetPointerAction(PointerEvent::POINTER_ACTION_CANCEL); + + auto normalizeHandler = InputHandler->GetEventNormalizeHandler(); + CHKPV(normalizeHandler); + normalizeHandler->HandleTouchEvent(event); + + pointerItem.SetPressed(true); + event->UpdatePointerItem(event->GetPointerId(), pointerItem); + event->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN); +} } // namespace MMI } // namespace OHOS diff --git a/test/facility/mock/include/input_windows_manager_mock.h b/test/facility/mock/include/input_windows_manager_mock.h index 3f9ddd1b2..217c1e00d 100644 --- a/test/facility/mock/include/input_windows_manager_mock.h +++ b/test/facility/mock/include/input_windows_manager_mock.h @@ -148,6 +148,7 @@ public: #ifdef OHOS_BUILD_ENABLE_TOUCH MOCK_METHOD(std::shared_ptr, GetLastPointerEventForGesture, ()); #endif // OHOS_BUILD_ENABLE_TOUCH + void SwitchTouchTracking(bool touchTracking) override {} static std::shared_ptr GetInstance(); diff --git a/util/common/include/error_multimodal.h b/util/common/include/error_multimodal.h index 8324ca303..14d7b0551 100644 --- a/util/common/include/error_multimodal.h +++ b/util/common/include/error_multimodal.h @@ -121,6 +121,8 @@ enum { SESSION_NOT_FOUND, // 监听增加失败 INVALID_MONITOR_MON, + // 权限校验失败 + PERMISSION_DENIED, // 功能不支持 CAPABILITY_NOT_SUPPORTED }; -- Gitee