Fix PopupMenuTest#testHoverSelectsMenuItem failure
The `Instrumentation.sendPointerSync` used
INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT that would not wait for the
input event to finish being handled by the application.
This CL Replaced it by `CtsMouseUtil` so we can guarantee the
application could handle the event before it return.
Bug: 228201593
Test: atest PopupMenuTest
Change-Id: I5d14b92d774a17992aec8f026847f26b21b00556
diff --git a/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java b/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java
index 8905883..275fc4e 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java
@@ -37,11 +37,9 @@
import android.graphics.drawable.ColorDrawable;
import android.os.SystemClock;
import android.view.Gravity;
-import android.view.InputDevice;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
-import android.view.MotionEvent;
import android.view.SubMenu;
import android.view.View;
import android.widget.EditText;
@@ -55,6 +53,7 @@
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
+import com.android.compatibility.common.util.CtsMouseUtil;
import com.android.compatibility.common.util.CtsTouchUtils;
import com.android.compatibility.common.util.WidgetTestUtils;
@@ -442,7 +441,7 @@
ListView menuItemList = mPopupMenu.getMenuListView();
assertEquals(0, menuItemList.getFirstVisiblePosition());
- emulateHoverOverVisibleItems(mInstrumentation, menuItemList);
+ emulateHoverOverVisibleItems(menuItemList);
// Select the last item to force menu scrolling and emulate hover again.
mActivityRule.runOnUiThread(
@@ -451,40 +450,27 @@
assertNotEquals("Too few menu items to test for scrolling",
0, menuItemList.getFirstVisiblePosition());
- emulateHoverOverVisibleItems(mInstrumentation, menuItemList);
+ emulateHoverOverVisibleItems(menuItemList);
mPopupMenu = null;
}
- private void emulateHoverOverVisibleItems(Instrumentation instrumentation, ListView listView) {
+ private void emulateHoverOverVisibleItems(ListView listView) {
final int childCount = listView.getChildCount();
// The first/last child may present partially on the app, we should ignore them when inject
// mouse events to prevent the event send to the wrong target.
for (int i = 1; i < childCount - 1; i++) {
View itemView = listView.getChildAt(i);
- injectMouseEvent(instrumentation, itemView, MotionEvent.ACTION_HOVER_MOVE);
-
+ CtsMouseUtil.emulateHoverOnView(mInstrumentation, itemView, itemView.getWidth() / 2,
+ itemView.getHeight() / 2);
// Wait for the system to process all events in the queue.
- instrumentation.waitForIdleSync();
-
+ mInstrumentation.waitForIdleSync();
// Hovered menu item should be selected.
assertEquals(listView.getFirstVisiblePosition() + i,
listView.getSelectedItemPosition());
}
}
- private static void injectMouseEvent(Instrumentation instrumentation, View view, int action) {
- final int[] xy = new int[2];
- view.getLocationOnScreen(xy);
- final int x = xy[0] + view.getWidth() / 2;
- final int y = xy[1] + view.getHeight() / 2;
- long eventTime = SystemClock.uptimeMillis();
- MotionEvent event = MotionEvent.obtain(eventTime, eventTime, action, x, y, 0);
- event.setSource(InputDevice.SOURCE_MOUSE);
- instrumentation.sendPointerSync(event);
- event.recycle();
- }
-
/**
* Inner helper class to configure an instance of {@link PopupMenu} for the specific test.
* The main reason for its existence is that once a popup menu is shown with the show() method,