diff --git a/quickstep/res/color/menu_item_hover_state_color.xml b/quickstep/res/color/menu_item_hover_state_color.xml new file mode 100644 index 0000000000..269b9f1c68 --- /dev/null +++ b/quickstep/res/color/menu_item_hover_state_color.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/quickstep/res/drawable/task_menu_item_bg.xml b/quickstep/res/drawable/task_menu_item_bg.xml index 16c13ebebc..588fe9ec25 100644 --- a/quickstep/res/drawable/task_menu_item_bg.xml +++ b/quickstep/res/drawable/task_menu_item_bg.xml @@ -15,8 +15,7 @@ limitations under the License. --> - - + + diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index c4f82695d5..80fded5872 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -107,6 +107,8 @@ public final class LauncherInstrumentation { static final Pattern EVENT_TOUCH_DOWN_TIS = getTouchEventPatternTIS("ACTION_DOWN"); static final Pattern EVENT_TOUCH_UP_TIS = getTouchEventPatternTIS("ACTION_UP"); static final Pattern EVENT_TOUCH_CANCEL_TIS = getTouchEventPatternTIS("ACTION_CANCEL"); + static final Pattern EVENT_HOVER_ENTER_TIS = getTouchEventPatternTIS("ACTION_HOVER_ENTER"); + static final Pattern EVENT_HOVER_EXIT_TIS = getTouchEventPatternTIS("ACTION_HOVER_EXIT"); private static final Pattern EVENT_KEY_BACK_DOWN = getKeyEventPattern("ACTION_DOWN", "KEYCODE_BACK"); @@ -140,7 +142,9 @@ public final class LauncherInstrumentation { * Represents a point in the code at which a callback can run. */ public enum CALLBACK_RUN_POINT { - CALLBACK_HOLD_BEFORE_DROP + CALLBACK_HOLD_BEFORE_DROP, + CALLBACK_HOVER_ENTER, + CALLBACK_HOVER_EXIT, } private Consumer mCallbackAtRunPoint = null; @@ -1682,6 +1686,12 @@ public final class LauncherInstrumentation { ? EVENT_TOUCH_CANCEL_TIS : EVENT_TOUCH_UP_TIS); } break; + case MotionEvent.ACTION_HOVER_ENTER: + expectEvent(TestProtocol.SEQUENCE_TIS, EVENT_HOVER_ENTER_TIS); + break; + case MotionEvent.ACTION_HOVER_EXIT: + expectEvent(TestProtocol.SEQUENCE_TIS, EVENT_HOVER_EXIT_TIS); + break; } final MotionEvent event = getMotionEvent(downTime, currentTime, action, point.x, point.y); diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java index 54be3c324d..e349620e28 100644 --- a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java @@ -55,4 +55,12 @@ public class OverviewTaskMenu { UiObject2 menuItem = mLauncher.findObjectInContainer(mMenu, By.text(expectedMenuItemText)); return menuItem != null; } + + /** + * Returns the menu item specified by name if present. + */ + public OverviewTaskMenuItem getMenuItemByName(String menuItemName) { + return new OverviewTaskMenuItem(mLauncher, + mLauncher.waitForObjectInContainer(mMenu, By.text(menuItemName))); + } } diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenuItem.java b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenuItem.java new file mode 100644 index 0000000000..b2cc92de09 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenuItem.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.tapl; + +import static com.android.launcher3.tapl.LauncherInstrumentation.CALLBACK_RUN_POINT.CALLBACK_HOVER_ENTER; +import static com.android.launcher3.tapl.LauncherInstrumentation.CALLBACK_RUN_POINT.CALLBACK_HOVER_EXIT; + +import android.graphics.Point; +import android.graphics.Rect; +import android.os.SystemClock; +import android.view.MotionEvent; + +import androidx.test.uiautomator.UiObject2; + +/** Represents an item in the overview task menu. */ +public class OverviewTaskMenuItem { + + private final LauncherInstrumentation mLauncher; + private final UiObject2 mMenuItem; + + OverviewTaskMenuItem(LauncherInstrumentation launcher, UiObject2 menuItem) { + mLauncher = launcher; + mMenuItem = menuItem; + } + + /** + * Returns this menu item's visible bounds. + */ + public Rect getVisibleBounds() { + return mMenuItem.getVisibleBounds(); + } + + /** + * Emulate the cursor entering and exiting a hover over this menu item. + */ + public void hoverCursor() { + try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); + LauncherInstrumentation.Closable c = mLauncher.addContextLayer( + "cursor hover entering menu item")) { + long downTime = SystemClock.uptimeMillis(); + mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_HOVER_ENTER, + new Point(mMenuItem.getVisibleCenter().x, mMenuItem.getVisibleCenter().y), + null); + mLauncher.runCallbackIfActive(CALLBACK_HOVER_ENTER); + + try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer( + "cursor hover exiting menu item")) { + downTime = SystemClock.uptimeMillis(); + mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_HOVER_EXIT, + new Point(mMenuItem.getVisibleCenter().x, mMenuItem.getVisibleCenter().y), + null); + mLauncher.runCallbackIfActive(CALLBACK_HOVER_EXIT); + } + } + } +}