diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java index b7000dbbb0..76489e0fa1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java @@ -19,6 +19,7 @@ import static android.view.MotionEvent.ACTION_HOVER_ENTER; import static android.view.MotionEvent.ACTION_HOVER_EXIT; import static android.view.View.ALPHA; +import static com.android.launcher3.AbstractFloatingView.TYPE_ACTION_POPUP; import static com.android.launcher3.AbstractFloatingView.TYPE_FOLDER; import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS; @@ -98,20 +99,18 @@ public class TaskbarHoverToolTipController implements View.OnHoverListener { @Override public boolean onHover(View v, MotionEvent event) { - boolean isFolderOpen = AbstractFloatingView.hasOpenView(mActivity, TYPE_FOLDER); // If hover leaves a taskbar icon animate the tooltip closed. if (event.getAction() == ACTION_HOVER_EXIT) { mHoverToolTipView.close(/* animate= */ false); mActivity.setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, false); - } else if (!isFolderOpen && event.getAction() == ACTION_HOVER_ENTER) { - // Do not reveal if any floating views such as folders or edu pop-ups are open. - revealHoverToolTip(); + } else if (event.getAction() == ACTION_HOVER_ENTER) { + maybeRevealHoverToolTip(); mActivity.setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, true); } return false; } - private void revealHoverToolTip() { + private void maybeRevealHoverToolTip() { if (mHoverView == null || mToolTipText == null) { return; } @@ -122,6 +121,12 @@ public class TaskbarHoverToolTipController implements View.OnHoverListener { if (mHoverView instanceof FolderIcon && !((FolderIcon) mHoverView).getIconVisible()) { return; } + // Do not reveal if floating views such as folders or app pop-ups are open, + // as these views will overlap and not look great. + if (AbstractFloatingView.hasOpenView(mActivity, TYPE_FOLDER | TYPE_ACTION_POPUP)) { + return; + } + Rect iconViewBounds = Utilities.getViewBounds(mHoverView); mHoverToolTipView.showAtLocation(mToolTipText, iconViewBounds.centerX(), mTaskbarView.getTop() - mYOffset, /* shouldAutoClose= */ false); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java index 1a6cd6042e..7f240bd781 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java @@ -83,7 +83,7 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba // Initialized in init. private TaskbarControllers mControllers; private boolean mAllowInitialSplitSelection; - private AppInfo[] mAppInfosList; + private AppInfo[] mAppInfosList = AppInfo.EMPTY_ARRAY; // Saves the ItemInfos in the hotseat without the predicted items. private SparseArray mHotseatInfosList; private ManageWindowsTaskbarShortcut mManageWindowsTaskbarShortcut; diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt new file mode 100644 index 0000000000..d2b9fcf2c5 --- /dev/null +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2025 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.taskbar + +import android.view.MotionEvent +import android.view.MotionEvent.ACTION_HOVER_ENTER +import android.view.MotionEvent.ACTION_HOVER_EXIT +import com.android.launcher3.AbstractFloatingView +import com.android.launcher3.BubbleTextView +import com.android.launcher3.R +import com.android.launcher3.apppairs.AppPairIcon +import com.android.launcher3.folder.FolderIcon +import com.android.launcher3.model.data.WorkspaceItemInfo +import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync +import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatAppPairsItem +import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatFolderItem +import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatWorkspaceItem +import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule +import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController +import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext +import com.android.launcher3.util.LauncherMultivalentJUnit +import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(LauncherMultivalentJUnit::class) +@EmulatedDevices(["pixelFoldable2023", "pixelTablet2023"]) +class TaskbarHoverToolTipControllerTest { + + @get:Rule(order = 0) val context = TaskbarWindowSandboxContext.create() + @get:Rule(order = 1) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context) + + @InjectController lateinit var autohideSuspendController: TaskbarAutohideSuspendController + @InjectController lateinit var popupController: TaskbarPopupController + + private val taskbarContext: TaskbarActivityContext by taskbarUnitTestRule::activityContext + + private lateinit var taskbarView: TaskbarView + private lateinit var iconView: BubbleTextView + private lateinit var appPairIcon: AppPairIcon + private lateinit var folderIcon: FolderIcon + + private val isHoverToolTipOpen: Boolean + get() { + // TaskbarHoverToolTip uses ArrowTipView which is type TYPE_ON_BOARD_POPUP. + return AbstractFloatingView.hasOpenView( + taskbarContext, + AbstractFloatingView.TYPE_ON_BOARD_POPUP, + ) + } + + @Before + fun setup() { + runOnMainSync { taskbarView = taskbarContext.dragLayer.findViewById(R.id.taskbar_view) } + + val hotseatItems = + arrayOf( + createHotseatWorkspaceItem(), + createHotseatAppPairsItem(), + createHotseatFolderItem(), + ) + runOnMainSync { + taskbarView.updateItems(hotseatItems, emptyList()) + iconView = + taskbarView.iconViews.filterIsInstance().first { + it.tag is WorkspaceItemInfo + } + appPairIcon = taskbarView.iconViews.filterIsInstance().first() + folderIcon = taskbarView.iconViews.filterIsInstance().first() + } + } + + @Test + fun onHover_hoverEnterIcon_revealToolTip_hoverExitIcon_closeToolTip() { + runOnMainSync { iconView.dispatchGenericMotionEvent(HOVER_ENTER) } + assertThat(isHoverToolTipOpen).isTrue() + assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isTrue() + runOnMainSync { iconView.dispatchGenericMotionEvent(HOVER_EXIT) } + assertThat(isHoverToolTipOpen).isFalse() + assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isFalse() + } + + @Test + fun onHover_hoverEnterFolderIcon_revealToolTip_hoverExitFolderIcon_closeToolTip() { + runOnMainSync { folderIcon.dispatchGenericMotionEvent(HOVER_ENTER) } + assertThat(isHoverToolTipOpen).isTrue() + assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isTrue() + runOnMainSync { folderIcon.dispatchGenericMotionEvent(HOVER_EXIT) } + assertThat(isHoverToolTipOpen).isFalse() + assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isFalse() + } + + @Test + fun onHover_hoverEnterAppPair_revealToolTip_hoverExitAppPair_closeToolTip() { + runOnMainSync { appPairIcon.dispatchGenericMotionEvent(HOVER_ENTER) } + assertThat(isHoverToolTipOpen).isTrue() + assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isTrue() + runOnMainSync { appPairIcon.dispatchGenericMotionEvent(HOVER_EXIT) } + assertThat(isHoverToolTipOpen).isFalse() + assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isFalse() + } + + @Test + fun onHover_hoverEnterIconAlignedWithHotseat_noToolTip() { + taskbarContext.setUIController( + object : TaskbarUIController() { + override fun isIconAlignedWithHotseat(): Boolean = true + } + ) + + runOnMainSync { iconView.dispatchGenericMotionEvent(HOVER_ENTER) } + assertThat(isHoverToolTipOpen).isFalse() + } + + @Test + fun onHover_hoverEnterFolderOpen_noToolTip() { + runOnMainSync { + folderIcon.folder.animateOpen() + iconView.dispatchGenericMotionEvent(HOVER_ENTER) + } + assertThat(isHoverToolTipOpen).isFalse() + } + + @Test + fun onHover_hoverEnterPopupOpen_noToolTip() { + runOnMainSync { + popupController.showForIcon(iconView) + iconView.dispatchGenericMotionEvent(HOVER_ENTER) + } + assertThat(isHoverToolTipOpen).isFalse() + } + + companion object { + private val HOVER_EXIT = MotionEvent.obtain(0, 0, ACTION_HOVER_EXIT, 0f, 0f, 0) + private val HOVER_ENTER = MotionEvent.obtain(0, 0, ACTION_HOVER_ENTER, 0f, 0f, 0) + } +} diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt index e52aacf6d5..92abbbaa0a 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt @@ -18,8 +18,13 @@ package com.android.launcher3.taskbar import android.content.ComponentName import android.content.Intent +import android.graphics.Bitmap +import android.graphics.Bitmap.createBitmap import android.os.Process +import com.android.launcher3.icons.BitmapInfo import com.android.launcher3.model.data.AppInfo +import com.android.launcher3.model.data.AppPairInfo +import com.android.launcher3.model.data.FolderInfo import com.android.launcher3.model.data.ItemInfo import com.android.launcher3.model.data.WorkspaceItemInfo import com.android.launcher3.taskbar.TaskbarIconType.ALL_APPS @@ -53,7 +58,27 @@ object TaskbarViewTestUtil { return WorkspaceItemInfo( AppInfo(TEST_COMPONENT, "Test App $id", Process.myUserHandle(), Intent()) ) - .apply { this.id = id } + .apply { + this.id = id + // Create a placeholder icon so that the test doesn't try to load a high-res icon. + this.bitmap = BitmapInfo.fromBitmap(createBitmap(1, 1, Bitmap.Config.ALPHA_8)) + } + } + + fun createHotseatAppPairsItem(): AppPairInfo { + return AppPairInfo().apply { + add(createHotseatWorkspaceItem(1)) + add(createHotseatWorkspaceItem(2)) + } + } + + fun createHotseatFolderItem(): FolderInfo { + return FolderInfo().apply { + title = "Test Folder" + add(createHotseatWorkspaceItem(1)) + add(createHotseatWorkspaceItem(2)) + add(createHotseatWorkspaceItem(3)) + } } /** Creates a list of fake recent tasks. */ diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt index 2dacf69590..19c88240d9 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt @@ -28,6 +28,7 @@ import com.android.launcher3.taskbar.TaskbarActivityContext import com.android.launcher3.taskbar.TaskbarControllers import com.android.launcher3.taskbar.TaskbarManager import com.android.launcher3.taskbar.TaskbarNavButtonController.TaskbarNavButtonCallbacks +import com.android.launcher3.taskbar.TaskbarUIController import com.android.launcher3.taskbar.bubbles.BubbleControllers import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR @@ -117,6 +118,8 @@ class TaskbarUnitTestRule( super.recreateTaskbars() if (currentActivityContext != null) { injectControllers() + // TODO(b/346394875): we should test a non-default uiController. + activityContext.setUIController(TaskbarUIController.DEFAULT) controllerInjectionCallback.invoke() } } diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java deleted file mode 100644 index 3f7c85c899..0000000000 --- a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * 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.taskbar; - -import static androidx.test.core.app.ApplicationProvider.getApplicationContext; - -import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.Context; -import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; -import android.view.Display; -import android.view.MotionEvent; - -import androidx.test.filters.SmallTest; - -import com.android.launcher3.BubbleTextView; -import com.android.launcher3.apppairs.AppPairIcon; -import com.android.launcher3.folder.Folder; -import com.android.launcher3.folder.FolderIcon; -import com.android.launcher3.model.data.FolderInfo; -import com.android.launcher3.util.ActivityContextWrapper; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.stubbing.Answer; - -/** - * Tests for TaskbarHoverToolTipController. - */ -@SmallTest -@RunWith(AndroidTestingRunner.class) -@TestableLooper.RunWithLooper(setAsMainLooper = true) -public class TaskbarHoverToolTipControllerTest extends TaskbarBaseTestCase { - - private TaskbarHoverToolTipController mTaskbarHoverToolTipController; - private TestableLooper mTestableLooper; - - @Mock private TaskbarView mTaskbarView; - @Mock private MotionEvent mMotionEvent; - @Mock private BubbleTextView mHoverBubbleTextView; - @Mock private FolderIcon mHoverFolderIcon; - @Mock private AppPairIcon mAppPairIcon; - @Mock private Display mDisplay; - @Mock private TaskbarDragLayer mTaskbarDragLayer; - private Folder mSpyFolderView; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - - Context context = getApplicationContext(); - - doAnswer((Answer) invocation -> context.getSystemService( - (String) invocation.getArgument(0))) - .when(taskbarActivityContext).getSystemService(anyString()); - when(taskbarActivityContext.getResources()).thenReturn(context.getResources()); - when(taskbarActivityContext.getApplicationInfo()).thenReturn( - context.getApplicationInfo()); - when(taskbarActivityContext.getDragLayer()).thenReturn(mTaskbarDragLayer); - when(taskbarActivityContext.getMainLooper()).thenReturn(context.getMainLooper()); - when(taskbarActivityContext.getDisplay()).thenReturn(mDisplay); - when(taskbarActivityContext.isIconAlignedWithHotseat()).thenReturn(false); - - when(mTaskbarDragLayer.getChildCount()).thenReturn(1); - mSpyFolderView = spy(new Folder(new ActivityContextWrapper(context), null)); - when(mTaskbarDragLayer.getChildAt(anyInt())).thenReturn(mSpyFolderView); - doReturn(false).when(mSpyFolderView).isOpen(); - - when(mHoverBubbleTextView.getText()).thenReturn("tooltip"); - doAnswer((Answer) invocation -> { - Object[] args = invocation.getArguments(); - ((int[]) args[0])[0] = 0; - ((int[]) args[0])[1] = 0; - return null; - }).when(mHoverBubbleTextView).getLocationOnScreen(any(int[].class)); - when(mHoverBubbleTextView.getWidth()).thenReturn(100); - when(mHoverBubbleTextView.getHeight()).thenReturn(100); - - mHoverFolderIcon.mInfo = new FolderInfo(); - mHoverFolderIcon.mInfo.title = "tooltip"; - doAnswer((Answer) invocation -> { - Object[] args = invocation.getArguments(); - ((int[]) args[0])[0] = 0; - ((int[]) args[0])[1] = 0; - return null; - }).when(mHoverFolderIcon).getLocationOnScreen(any(int[].class)); - when(mHoverFolderIcon.getWidth()).thenReturn(100); - when(mHoverFolderIcon.getHeight()).thenReturn(100); - - when(mTaskbarView.getTop()).thenReturn(200); - - mTaskbarHoverToolTipController = new TaskbarHoverToolTipController( - taskbarActivityContext, mTaskbarView, mHoverBubbleTextView); - mTestableLooper = TestableLooper.get(this); - } - - @Test - public void onHover_hoverEnterIcon_revealToolTip() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mHoverBubbleTextView, mMotionEvent); - waitForIdleSync(); - - assertThat(hoverConsumed).isFalse(); - verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, - true); - } - - @Test - public void onHover_hoverExitIcon_closeToolTip() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mHoverBubbleTextView, mMotionEvent); - waitForIdleSync(); - - assertThat(hoverConsumed).isFalse(); - verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, - false); - } - - @Test - public void onHover_hoverEnterFolderIcon_revealToolTip() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent); - waitForIdleSync(); - - assertThat(hoverConsumed).isFalse(); - verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, - true); - } - - @Test - public void onHover_hoverExitFolderIcon_closeToolTip() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent); - waitForIdleSync(); - - assertThat(hoverConsumed).isFalse(); - verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, - false); - } - - @Test - public void onHover_hoverExitFolderOpen_closeToolTip() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT); - doReturn(true).when(mSpyFolderView).isOpen(); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent); - waitForIdleSync(); - - assertThat(hoverConsumed).isFalse(); - verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, - false); - } - - @Test - public void onHover_hoverEnterFolderOpen_noToolTip() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - doReturn(true).when(mSpyFolderView).isOpen(); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent); - - assertThat(hoverConsumed).isFalse(); - } - - @Test - public void onHover_hoverMove_noUpdate() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_MOVE); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_MOVE); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent); - - assertThat(hoverConsumed).isFalse(); - } - - @Test - public void onHover_hoverEnterAppPair_revealToolTip() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mAppPairIcon, mMotionEvent); - waitForIdleSync(); - - assertThat(hoverConsumed).isFalse(); - verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, - true); - } - - @Test - public void onHover_hoverExitAppPair_closeToolTip() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mAppPairIcon, mMotionEvent); - waitForIdleSync(); - - assertThat(hoverConsumed).isFalse(); - verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, - false); - } - - @Test - public void onHover_hoverEnterIconAlignedWithHotseat_noReveal() { - when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER); - when(taskbarActivityContext.isIconAlignedWithHotseat()).thenReturn(true); - - boolean hoverConsumed = - mTaskbarHoverToolTipController.onHover(mHoverBubbleTextView, mMotionEvent); - waitForIdleSync(); - - assertThat(hoverConsumed).isFalse(); - verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, - true); - } - - private void waitForIdleSync() { - mTestableLooper.processAllMessages(); - } -}