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,