diff --git a/wm/include/input_transfer_station.h b/wm/include/input_transfer_station.h index eae23bacc1f9cb368d074b10741f7df7a00bc358..8a46755d98d033810931356e94872c2839f71a17 100644 --- a/wm/include/input_transfer_station.h +++ b/wm/include/input_transfer_station.h @@ -53,14 +53,17 @@ private: } sptr GetInputChannel(uint32_t windowId); + void ResetSuperFoldDisplayY(std::shared_ptr pointerEvent); + std::mutex mtx_; bool destroyed_ { false }; std::unordered_map> windowInputChannels_; std::shared_ptr inputListener_ = nullptr; std::shared_ptr eventHandler_ = nullptr; const std::string INPUT_AND_VSYNC_THREAD = "InputAndVsyncThread"; + mutable int32_t offsetY_ = -1; - bool isRegisteredMMI_ { false }; + bool isRegisteredMMI_ { false }; }; class InputEventListener : public MMI::IInputEventConsumer { diff --git a/wm/src/input_transfer_station.cpp b/wm/src/input_transfer_station.cpp index 080e4251f8f7b1956f0929a878002710b80392bb..af53fa3457abcbd410e9f5e9a29b2d5d3d7be6c6 100644 --- a/wm/src/input_transfer_station.cpp +++ b/wm/src/input_transfer_station.cpp @@ -21,6 +21,10 @@ #include "wm_common_inner.h" #include "gtx_input_event_sender.h" #include +#include "common/include/fold_screen_state_internel.h" +#include "display_manager.h" +#include "fold_screen_controller/super_fold_state_manager.h" +#include "singleton_container.h" namespace OHOS { namespace Rosen { @@ -67,12 +71,50 @@ void InputEventListener::OnInputEvent(std::shared_ptr axisEvent) axisEvent->MarkProcessed(); } +void InputTransferStation::ResetSuperFoldDisplayY(std::shared_ptr pointerEvent) +{ + if (offsetY_ == -1) { + auto foldCreaseRegion = Rosen::DisplayManager::GetInstance().GetCurrentFoldCreaseRegion(); + if (foldCreaseRegion == nullptr) { + TLOGE(WmsLogTag::WMS_INPUT_KEY_FLOW, "foldCreaseRegion is nullptr"); + return; + } + auto creaseRects = foldCreaseRegion->GetCreaseRects(); + if (creaseRects.empty()) { + TLOGE(WmsLogTag::WMS_INPUT_KEY_FLOW, "creaseRects is empty"); + return; + } + auto rect = creaseRects.front(); + offsetY_ = rect.height_ + rect.posY_; + TLOGI(WmsLogTag::WMS_EVENT, "rect.height_: %{public}d, rect.posY_: %{public}d", rect.height_, rect.posY_); + } + if (pointerEvent == nullptr) { + TLOGE(WmsLogTag::WMS_INPUT_KEY_FLOW, "PointerEvent is nullptr"); + return; + } + MMI::PointerEvent::PointerItem pointerItem; + if (!pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem)) { + TLOGE(WmsLogTag::WMS_INPUT_KEY_FLOW, "pointerItem is empty"); + return; + } + auto displayY_ = pointerItem.GetDisplayY(); + if (displayY_ >= offsetY_) { + pointerItem.SetDisplayY(displayY_ - offsetY_); + pointerEvent->AddPointerItem(pointerItem); + TLOGD(WmsLogTag::WMS_EVENT, "Calculated offsetY_: %{public}d", offsetY_); + } +} + void InputEventListener::OnInputEvent(std::shared_ptr pointerEvent) const { if (pointerEvent == nullptr) { TLOGE(WmsLogTag::WMS_INPUT_KEY_FLOW, "PointerEvent is nullptr"); return; } + if (FoldScreenStateInternel::IsSuperFoldDisplayDevice() && + SingletonContainer::Get().GetFoldStatus() == FoldStatus::HALF_FOLD) { + InputTransferStation::GetInstance().ResetSuperFoldDisplayY(pointerEvent); + } HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "IEL:PointerEvent id:%d action:%d", pointerEvent->GetId(), pointerEvent->GetPointerAction()); // If handling input event at server, client will receive pointEvent that the winId is -1, intercept log error diff --git a/wm/test/unittest/input_transfer_station_test.cpp b/wm/test/unittest/input_transfer_station_test.cpp index a66799de7d5886acd20b6831fdface5d2e901b6e..933b05ff807de66fc70c5924e334b4b9352f947e 100644 --- a/wm/test/unittest/input_transfer_station_test.cpp +++ b/wm/test/unittest/input_transfer_station_test.cpp @@ -19,6 +19,7 @@ #include "window_impl.h" #include "mock_window_adapter.h" #include "singleton_mocker.h" +#include "display_manager.h" using namespace testing; using namespace testing::ext; @@ -183,6 +184,34 @@ HWTEST_F(InputTransferStationTest, GetInputChannel, Function | SmallTest | Level InputTransferStation::GetInstance().AddInputWindow(window_); InputTransferStation::GetInstance().GetInputChannel(0); } + +/** + * @tc.name: ResetSuperFoldDisplayY + * @tc.desc: ResetSuperFoldDisplayY + * @tc.type: FUNC + */ +HWTEST_F(InputTransferStationTest, ResetSuperFoldDisplayY, Function | SmallTest | Level2) +{ + auto pointerEvent = MMI::PointerEvent::Create(); + if (!pointerEvent || !listener) { + GTEST_LOG_(INFO) << "Null Pointer"; + return; + } + MMI::PointerEvent::PointerItem pointerItem; + pointerItem.SetDisplayY(150); + pointerEvent->AddPointerItem(pointerItem); + int originalDisplayY = pointerItem.GetDisplayY(); + InputTransferStation::GetInstance().ResetSuperFoldDisplayY(pointerEvent); + pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem); + int updatedDisplayY = pointerItem.GetDisplayY(); + ASSERT_EQ(updatedDisplayY, originalDisplayY); + + InputTransferStation::GetInstance().offsetY_ = 150; + InputTransferStation::GetInstance().ResetSuperFoldDisplayY(pointerEvent); + pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem); + updatedDisplayY = pointerItem.GetDisplayY(); + ASSERT_EQ(updatedDisplayY, originalDisplayY - 150); +} } } // namespace Rosen } // namespace OHOS