diff --git a/window_scene/session/host/src/move_drag_controller.cpp b/window_scene/session/host/src/move_drag_controller.cpp index db52717f673ee060fcfa5f506765f98109b919d2..47551ab00afb0435438846f671f097dfabb9f417 100644 --- a/window_scene/session/host/src/move_drag_controller.cpp +++ b/window_scene/session/host/src/move_drag_controller.cpp @@ -153,19 +153,21 @@ bool MoveDragController::ConsumeMoveEvent(const std::shared_ptrGetPointerId(); + MMI::PointerEvent::PointerItem pointerItem; + if (!pointerEvent->GetPointerItem(pointerId, pointerItem)) { + TLOGE(WmsLogTag::WMS_LAYOUT, "Failed to get pointer item, pointerId: %{public}d", pointerId); + return false; + } int32_t startPointerId = moveDragProperty_.pointerId_; int32_t startPointerType = moveDragProperty_.pointerType_; - if ((startPointerId != -1 && startPointerId != pointerId) || - (startPointerType != -1 && pointerEvent->GetSourceType() != startPointerType)) { + int32_t sourceType = pointerEvent->GetSourceType(); + if ((startPointerId != -1 && startPointerId != pointerItem.GetOriginPointerId()) || + (startPointerType != -1 && startPointerType != sourceType)) { WLOGFI("block unnecessary pointer event inside the window"); return false; } - MMI::PointerEvent::PointerItem pointerItem; - int32_t sourceType = pointerEvent->GetSourceType(); - if (!pointerEvent->GetPointerItem(pointerId, pointerItem) || - (sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE && - (pointerEvent->GetButtonId() != MMI::PointerEvent::MOUSE_BUTTON_LEFT && - !GetStartMoveFlag()))) { + if (sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE && + pointerEvent->GetButtonId() != MMI::PointerEvent::MOUSE_BUTTON_LEFT && !GetStartMoveFlag()) { WLOGFD("invalid pointerEvent id: %{public}d", persistentId_); return false; } @@ -320,7 +322,7 @@ bool MoveDragController::CalcMoveTargetRect(const std::shared_ptrGetSourceType(); moveDragProperty_.originalPointerPosX_ = pointerDisplayX; moveDragProperty_.originalPointerPosY_ = pointerDisplayY; @@ -375,7 +377,7 @@ bool MoveDragController::EventDownInit(const std::shared_ptr& } InitDecorValue(property, sysConfig); limits_ = property->GetWindowLimits(); - moveDragProperty_.pointerId_ = pointerEvent->GetPointerId(); + moveDragProperty_.pointerId_ = pointerItem.GetOriginPointerId(); moveDragProperty_.pointerType_ = sourceType; moveDragProperty_.originalPointerPosX_ = pointerItem.GetDisplayX(); moveDragProperty_.originalPointerPosY_ = pointerItem.GetDisplayY(); @@ -697,7 +699,7 @@ WSError MoveDragController::UpdateMoveTempProperty(const std::shared_ptrGetPointerAction()) { case MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN: case MMI::PointerEvent::POINTER_ACTION_DOWN: - moveTempProperty_.pointerId_ = pointerId; + moveTempProperty_.pointerId_ = pointerItem.GetOriginPointerId(); moveTempProperty_.pointerType_ = pointerType; moveTempProperty_.lastDownPointerPosX_ = pointerDisplayX; moveTempProperty_.lastDownPointerPosY_ = pointerDisplayY; @@ -707,7 +709,7 @@ WSError MoveDragController::UpdateMoveTempProperty(const std::shared_ptrGetPointerId(); + MMI::PointerEvent::PointerItem pointerItem; + if (!pointerEvent->GetPointerItem(pointerId, pointerItem)) { + TLOGW(WmsLogTag::WMS_LAYOUT, "Failed to get pointer item, pointerId: %{public}d", pointerId); + return false; + } int32_t startPointerId = moveDragProperty_.pointerId_; - if (GetStartDragFlag() && startPointerId != -1 && startPointerId != pointerId) { + int32_t startPointerType = moveDragProperty_.pointerType_; + if (GetStartDragFlag() && ((startPointerId != -1 && startPointerId != pointerItem.GetOriginPointerId()) || + (startPointerType != -1 && startPointerType != pointerEvent->GetSourceType()))) { WLOGFI("block unnecessary pointer event inside the window"); return false; } diff --git a/window_scene/test/unittest/move_drag_controller_test.cpp b/window_scene/test/unittest/move_drag_controller_test.cpp index b68ebe00b097f16402e6ee7f4bec4de9a9e986e8..d676d0f32e2e0178a81c0d8a0189ac197f73b390 100644 --- a/window_scene/test/unittest/move_drag_controller_test.cpp +++ b/window_scene/test/unittest/move_drag_controller_test.cpp @@ -268,6 +268,7 @@ HWTEST_F(MoveDragControllerTest, EventDownInit, Function | SmallTest | Level1) pointerEvent->SetTargetDisplayId(0); MMI::PointerEvent::PointerItem pointerItem; pointerItem.SetPointerId(0); + pointerItem.SetOriginPointerId(0); originalRect = { 10, 10, 10, 10 }; pointerItem.SetWindowX(100000000); pointerItem.SetWindowY(100000000); @@ -293,6 +294,7 @@ HWTEST_F(MoveDragControllerTest, EventDownInit01, Function | SmallTest | Level1) WSRect originalRect = { 100, 100, 1000, 1000 }; MMI::PointerEvent::PointerItem pointerItem; pointerItem.SetPointerId(1); + pointerItem.SetOriginPointerId(1); pointerItem.SetWindowX(1); pointerItem.SetWindowY(1); pointerEvent->AddPointerItem(pointerItem); @@ -528,46 +530,145 @@ HWTEST_F(MoveDragControllerTest, InitDecorValue01, Function | SmallTest | Level1 } /** - * @tc.name: ConsumeMoveEvent - * @tc.desc: test function : ConsumeMoveEvent + * @tc.name: TestConsumeMoveEventWithEarlyReturns + * @tc.desc: Verify that ConsumeMoveEvent handles various early-return scenarios * @tc.type: FUNC */ -HWTEST_F(MoveDragControllerTest, ConsumeMoveEvent, Function | SmallTest | Level1) +HWTEST_F(MoveDragControllerTest, TestConsumeMoveEventWithEarlyReturns, TestSize.Level1) { - std::shared_ptr pointerEvent = MMI::PointerEvent::Create(); - if (!pointerEvent) { - return; - } WSRect originalRect = { 100, 100, 1000, 1000 }; - ASSERT_EQ(false, moveDragController->ConsumeMoveEvent(nullptr, originalRect)); - auto preStratDragFlag = moveDragController->GetStartDragFlag(); + constexpr int32_t pointerId = 0; + MMI::PointerEvent::PointerItem pointerItem; + pointerItem.SetPointerId(pointerId); + pointerItem.SetOriginPointerId(pointerId); + auto pointerEvent = MMI::PointerEvent::Create(); + pointerEvent->SetPointerId(pointerId); + pointerEvent->AddPointerItem(pointerItem); + + // Case 1: Pointer event is null + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(nullptr, originalRect)); + + // Case 2: Start drag flag is true moveDragController->isStartDrag_ = true; - ASSERT_EQ(false, moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); moveDragController->isStartDrag_ = false; - pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN); + + // Case 3: Failed to get pointer item + std::shared_ptr noItemEvent = MMI::PointerEvent::Create(); + noItemEvent->SetPointerId(pointerId); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(noItemEvent, originalRect)); + + // Case 4: StartPointerId mismatch + moveDragController->moveDragProperty_.pointerId_ = pointerId + 1; + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + moveDragController->moveDragProperty_.pointerId_ = pointerId; + + // Case 5: StartPointerType mismatch + pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_MOUSE); + moveDragController->moveDragProperty_.pointerType_ = pointerEvent->GetSourceType() + 1; + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); +} + +/** + * @tc.name: TestConsumeMoveEventWithNotStartMove + * @tc.desc: Verify that ConsumeMoveEvent handles not-start-move flows + * @tc.type: FUNC + */ +HWTEST_F(MoveDragControllerTest, TestConsumeMoveEventWithNotStartMove, TestSize.Level1) +{ + WSRect originalRect = { 100, 100, 1000, 1000 }; + constexpr int32_t pointerId = 0; + MMI::PointerEvent::PointerItem pointerItem; + pointerItem.SetPointerId(pointerId); + pointerItem.SetOriginPointerId(pointerId); + auto pointerEvent = MMI::PointerEvent::Create(); + pointerEvent->SetPointerId(pointerId); + pointerEvent->AddPointerItem(pointerItem); + pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_MOUSE); + moveDragController->isStartDrag_ = false; + moveDragController->moveDragProperty_.pointerId_ = pointerId; + moveDragController->moveDragProperty_.pointerType_ = pointerEvent->GetSourceType(); + moveDragController->isStartMove_ = false; + + // Case 1: Mouse right button & not start move + pointerEvent->SetButtonId(MMI::PointerEvent::MOUSE_BUTTON_RIGHT); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + + // Case 2: Mouse left button & not start move pointerEvent->SetButtonId(MMI::PointerEvent::MOUSE_BUTTON_LEFT); - ASSERT_EQ(false, moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); - pointerEvent->SetSourceType(MMI::PointerEvent::MOUSE_BUTTON_LEFT); - moveDragController->SetStartMoveFlag(false); + pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_UNKNOWN); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + + // Case 3: ACTION_DOWN sets hasPointDown_ + moveDragController->hasPointDown_ = false; + pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_DOWN); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + EXPECT_TRUE(moveDragController->hasPointDown_); + + // Case 4: ACTION_BUTTON_DOWN sets hasPointDown_ + moveDragController->hasPointDown_ = false; pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN); - ASSERT_EQ(false, moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + EXPECT_TRUE(moveDragController->hasPointDown_); + + // Case 5: ACTION_UP resets hasPointDown_ + moveDragController->hasPointDown_ = true; + pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_UP); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + EXPECT_FALSE(moveDragController->hasPointDown_); + + // Case 6: ACTION_BUTTON_UP resets hasPointDown_ + moveDragController->hasPointDown_ = true; + pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_BUTTON_UP); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + EXPECT_FALSE(moveDragController->hasPointDown_); + + // Case 7: ACTION_CANCEL resets hasPointDown_ + moveDragController->hasPointDown_ = true; pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_CANCEL); - ASSERT_EQ(false, moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); - moveDragController->SetStartMoveFlag(true); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + EXPECT_FALSE(moveDragController->hasPointDown_); +} + +/** + * @tc.name: TestConsumeMoveEventWithStartMove + * @tc.desc: Verify that ConsumeMoveEvent handles start-move flows + * @tc.type: FUNC + */ +HWTEST_F(MoveDragControllerTest, TestConsumeMoveEventWithStartMove, TestSize.Level1) +{ + WSRect originalRect = { 100, 100, 1000, 1000 }; + constexpr int32_t pointerId = 0; + MMI::PointerEvent::PointerItem pointerItem; + pointerItem.SetPointerId(pointerId); + pointerItem.SetOriginPointerId(pointerId); + auto pointerEvent = MMI::PointerEvent::Create(); + pointerEvent->SetPointerId(pointerId); + pointerEvent->AddPointerItem(pointerItem); + pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_MOUSE); + moveDragController->isStartDrag_ = false; + moveDragController->moveDragProperty_.pointerId_ = pointerId; + moveDragController->moveDragProperty_.pointerType_ = pointerEvent->GetSourceType(); + + // Case 1: MOVE normal flow + moveDragController->isStartMove_ = true; pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_MOVE); - ASSERT_EQ(false, moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); - pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN); - ASSERT_EQ(false, moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + EXPECT_TRUE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + + // Case 2: UP ends drag + moveDragController->isStartMove_ = true; + moveDragController->hasPointDown_ = true; + pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_UP); + EXPECT_FALSE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); + EXPECT_FALSE(moveDragController->hasPointDown_); + EXPECT_FALSE(moveDragController->isStartMove_); + + // Case 3: UNKNOWN action + moveDragController->isStartMove_ = true; pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_UNKNOWN); - ASSERT_EQ(false, moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); - moveDragController->moveDragProperty_.pointerId_ = -2; - moveDragController->moveDragProperty_.pointerType_ = -2; - pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN); - ASSERT_EQ(false, moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); - moveDragController->isStartDrag_ = preStratDragFlag; + EXPECT_TRUE(moveDragController->ConsumeMoveEvent(pointerEvent, originalRect)); } - /** * @tc.name: ProcessWindowDragHotAreaFunc * @tc.desc: test function : ProcessWindowDragHotAreaFunc @@ -617,6 +718,7 @@ HWTEST_F(MoveDragControllerTest, ConsumeDragEvent, Function | SmallTest | Level1 ASSERT_EQ(false, moveDragController->ConsumeDragEvent(pointerEvent, originalRect, property, sysConfig)); MMI::PointerEvent::PointerItem pointerItem; pointerItem.SetPointerId(0); + pointerItem.SetOriginPointerId(0); pointerItem.SetWindowX(0); pointerItem.SetWindowY(0); pointerEvent->AddPointerItem(pointerItem); @@ -820,15 +922,16 @@ HWTEST_F(MoveDragControllerTest, GetFullScreenToFloatingRect, Function | SmallTe */ HWTEST_F(MoveDragControllerTest, CheckDragEventLegal, Function | SmallTest | Level1) { - std::shared_ptr pointerEvent = MMI::PointerEvent::Create(); - ASSERT_NE(pointerEvent, nullptr); - sptr property = new(std::nothrow) WindowSessionProperty(); - ASSERT_NE(property, nullptr); - auto tempPointerEvent = pointerEvent; - pointerEvent = nullptr; - auto result = moveDragController->CheckDragEventLegal(pointerEvent, property); + constexpr int32_t pointerId = 0; + MMI::PointerEvent::PointerItem pointerItem; + pointerItem.SetPointerId(pointerId); + pointerItem.SetOriginPointerId(pointerId); + auto pointerEvent = MMI::PointerEvent::Create(); + pointerEvent->SetPointerId(pointerId); + pointerEvent->AddPointerItem(pointerItem); + sptr property = sptr::MakeSptr(); + auto result = moveDragController->CheckDragEventLegal(nullptr, property); ASSERT_EQ(result, false); - pointerEvent = tempPointerEvent; result = moveDragController->CheckDragEventLegal(pointerEvent, nullptr); ASSERT_EQ(result, false); moveDragController->isStartMove_ = true; @@ -866,6 +969,7 @@ HWTEST_F(MoveDragControllerTest, UpdateMoveTempProperty, Function | SmallTest | ASSERT_EQ(result, WSError::WS_ERROR_NULLPTR); MMI::PointerEvent::PointerItem pointerItem; pointerItem.SetPointerId(0); + pointerItem.SetOriginPointerId(0); pointerEvent->AddPointerItem(pointerItem); pointerEvent->SetPointerId(0); pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_MOUSE); @@ -911,6 +1015,7 @@ HWTEST_F(MoveDragControllerTest, UpdateHotAreaType, Function | SmallTest | Level moveDragController->UpdateHotAreaType(pointerEvent); MMI::PointerEvent::PointerItem pointerItem; pointerItem.SetPointerId(0); + pointerItem.SetOriginPointerId(0); pointerEvent->AddPointerItem(pointerItem); pointerEvent->SetPointerId(0); moveDragController->UpdateHotAreaType(pointerEvent); diff --git a/window_scene/test/unittest/session_test.cpp b/window_scene/test/unittest/session_test.cpp index 4de4ed1f0471102f7fe547d6d46a10d8c0e4a3bb..41401c4cc116f851bd87e5ace5cf61d44a1ef1f5 100644 --- a/window_scene/test/unittest/session_test.cpp +++ b/window_scene/test/unittest/session_test.cpp @@ -522,41 +522,6 @@ HWTEST_F(WindowSessionTest, OnSessionEvent01, Function | SmallTest | Level2) ASSERT_EQ(result, WSError::WS_OK); } -/** - * @tc.name: ConsumeMoveEvent01 - * @tc.desc: ConsumeMoveEvent, abnormal scene - * @tc.type: FUNC - */ -HWTEST_F(WindowSessionTest, ConsumeMoveEvent01, Function | SmallTest | Level2) -{ - SessionInfo info; - info.abilityName_ = "testSession1"; - info.bundleName_ = "testSession3"; - sptr sceneSession = new (std::nothrow) SceneSession(info, nullptr); - sceneSession->moveDragController_ = new MoveDragController(1); - EXPECT_NE(sceneSession, nullptr); - ASSERT_TRUE(sceneSession->moveDragController_); - sceneSession->moveDragController_->InitMoveDragProperty(); - WSRect originalRect = { 100, 100, 1000, 1000 }; - - std::shared_ptr pointerEvent = nullptr; - auto result = sceneSession->moveDragController_->ConsumeMoveEvent(pointerEvent, originalRect); - ASSERT_FALSE(result); - - pointerEvent = MMI::PointerEvent::Create(); - ASSERT_TRUE(pointerEvent); - pointerEvent->SetPointerId(1); - sceneSession->moveDragController_->moveDragProperty_.pointerId_ = 0; - result = sceneSession->moveDragController_->ConsumeMoveEvent(pointerEvent, originalRect); - ASSERT_FALSE(result); - - pointerEvent->SetPointerId(0); - pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_MOUSE); - pointerEvent->SetButtonId(MMI::PointerEvent::MOUSE_BUTTON_RIGHT); - result = sceneSession->moveDragController_->ConsumeMoveEvent(pointerEvent, originalRect); - ASSERT_FALSE(result); -} - /** * @tc.name: ConsumeMoveEvent02 * @tc.desc: ConsumeMoveEvent, normal secne @@ -581,6 +546,7 @@ HWTEST_F(WindowSessionTest, ConsumeMoveEvent02, Function | SmallTest | Level2) pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN); MMI::PointerEvent::PointerItem pointerItem; pointerItem.SetPointerId(0); + pointerItem.SetOriginPointerId(0); pointerEvent->AddPointerItem(pointerItem); pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_MOVE); @@ -676,12 +642,12 @@ HWTEST_F(WindowSessionTest, ConsumeDragEvent02, Function | SmallTest | Level2) sessionConfig.backgroundswitch = true; sessionConfig.decorModeSupportInfo_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL; std::shared_ptr pointerEvent = MMI::PointerEvent::Create(); - ASSERT_TRUE(pointerEvent); pointerEvent->SetAgentWindowId(1); pointerEvent->SetPointerId(0); pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN); MMI::PointerEvent::PointerItem pointerItem; pointerItem.SetPointerId(0); + pointerItem.SetOriginPointerId(0); pointerEvent->AddPointerItem(pointerItem); pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_DOWN); @@ -738,13 +704,13 @@ HWTEST_F(WindowSessionTest, ConsumeDragEvent03, Function | SmallTest | Level2) sessionConfig.backgroundswitch = true; sessionConfig.decorModeSupportInfo_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL; std::shared_ptr pointerEvent = MMI::PointerEvent::Create(); - ASSERT_TRUE(pointerEvent); pointerEvent->SetAgentWindowId(1); pointerEvent->SetPointerId(0); pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN); pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_DOWN); MMI::PointerEvent::PointerItem pointerItem; pointerItem.SetPointerId(0); + pointerItem.SetOriginPointerId(0); pointerEvent->AddPointerItem(pointerItem); // LEFT_TOP @@ -797,13 +763,13 @@ HWTEST_F(WindowSessionTest, ConsumeDragEvent04, Function | SmallTest | Level2) sessionConfig.backgroundswitch = true; sessionConfig.decorModeSupportInfo_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL; std::shared_ptr pointerEvent = MMI::PointerEvent::Create(); - ASSERT_TRUE(pointerEvent); pointerEvent->SetAgentWindowId(1); pointerEvent->SetPointerId(0); pointerEvent->SetSourceType(MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN); pointerEvent->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_DOWN); MMI::PointerEvent::PointerItem pointerItem; pointerItem.SetPointerId(0); + pointerItem.SetOriginPointerId(0); pointerEvent->AddPointerItem(pointerItem); // LEFT