From b1ad3b6800ef93caafd72c90c1598a217da35ee1 Mon Sep 17 00:00:00 2001 From: Nikita Dubrovsky Date: Wed, 1 Jul 2020 09:51:48 -0700 Subject: [PATCH] Change cursor drag threshold from 30 to 45 degrees from vertical Bug: 158948887 Test: Manual and unit tests atest FrameworksCoreTests:EditorTouchStateTest atest FrameworksCoreTests:EditorCursorDragTest Change-Id: I6b30c0d6ef9c93fd4fd6aae3004cd6965e9d7be4 --- core/java/android/widget/EditorTouchState.java | 9 +++------ .../src/android/widget/EditorCursorDragTest.java | 4 ++-- .../src/android/widget/EditorTouchStateTest.java | 4 ++-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/core/java/android/widget/EditorTouchState.java b/core/java/android/widget/EditorTouchState.java index ff3ac0732aa21..9eb63087a66eb 100644 --- a/core/java/android/widget/EditorTouchState.java +++ b/core/java/android/widget/EditorTouchState.java @@ -174,12 +174,9 @@ public class EditorTouchState { int touchSlop = config.getScaledTouchSlop(); mMovedEnoughForDrag = distanceSquared > touchSlop * touchSlop; if (mMovedEnoughForDrag) { - // If the direction of the swipe motion is within 30 degrees of vertical, it is - // considered a vertical drag. We don't actually have to compute the angle to - // implement the check though. When the angle is exactly 30 degrees from - // vertical, 2*deltaX = distance. When the angle is less than 30 degrees from - // vertical, 2*deltaX < distance. - mIsDragCloseToVertical = (4 * deltaXSquared) <= distanceSquared; + // If the direction of the swipe motion is within 45 degrees of vertical, it is + // considered a vertical drag. + mIsDragCloseToVertical = Math.abs(deltaX) <= Math.abs(deltaY); } } } else if (action == MotionEvent.ACTION_CANCEL) { diff --git a/core/tests/coretests/src/android/widget/EditorCursorDragTest.java b/core/tests/coretests/src/android/widget/EditorCursorDragTest.java index 89cc6e743752c..838f60069f270 100644 --- a/core/tests/coretests/src/android/widget/EditorCursorDragTest.java +++ b/core/tests/coretests/src/android/widget/EditorCursorDragTest.java @@ -145,7 +145,7 @@ public class EditorCursorDragTest { // Swipe along a diagonal path. This should drag the cursor. Because we snap the finger to // the handle as the touch moves downwards (and because we have some slop to avoid jumping // across lines), the cursor position will end up higher than the finger position. - onView(withId(R.id.textview)).perform(dragOnText(text.indexOf("line1"), text.indexOf("3"))); + onView(withId(R.id.textview)).perform(dragOnText(text.indexOf("line1"), text.indexOf("2"))); onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.indexOf("1"))); // Swipe right-down along a very steep diagonal path. This should not drag the cursor. @@ -181,7 +181,7 @@ public class EditorCursorDragTest { // Swipe along a diagonal path. This should drag the cursor. Because we snap the finger to // the handle as the touch moves downwards (and because we have some slop to avoid jumping // across lines), the cursor position will end up higher than the finger position. - onView(withId(R.id.textview)).perform(dragOnText(text.indexOf("line1"), text.indexOf("3"))); + onView(withId(R.id.textview)).perform(dragOnText(text.indexOf("line1"), text.indexOf("2"))); onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.indexOf("1"))); // Swipe right-down along a very steep diagonal path. This should not drag the cursor. diff --git a/core/tests/coretests/src/android/widget/EditorTouchStateTest.java b/core/tests/coretests/src/android/widget/EditorTouchStateTest.java index ec75e40f13347..35fd4bd7dc14a 100644 --- a/core/tests/coretests/src/android/widget/EditorTouchStateTest.java +++ b/core/tests/coretests/src/android/widget/EditorTouchStateTest.java @@ -326,9 +326,9 @@ public class EditorTouchStateTest { mTouchState.update(event1, mConfig); assertSingleTap(mTouchState, 0f, 0f, 0, 0); - // Simulate an ACTION_MOVE event that is > 30 deg from vertical. + // Simulate an ACTION_MOVE event that is > 45 deg from vertical. long event2Time = 1002; - MotionEvent event2 = moveEvent(event1Time, event2Time, 100f, 173f); + MotionEvent event2 = moveEvent(event1Time, event2Time, 100f, 90f); mTouchState.update(event2, mConfig); assertDrag(mTouchState, 0f, 0f, 0, 0, false);