diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java index 4bd627a868..159b65fcd3 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java @@ -179,6 +179,21 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { actionsView.clickAndDismissScreenshot(); } + @Test + @PortraitLandscape + public void testSplitFromOverview() { + assumeTrue(!mLauncher.isTablet()); + + startTestActivity(2); + startTestActivity(3); + + mLauncher.goHome().switchToOverview().getCurrentTask() + .tapMenu() + .tapSplitMenuItem() + .getTestActivityTask(2) + .open(); + } + @Test @PortraitLandscape public void testSplitFromOverviewForTablet() { diff --git a/tests/tapl/com/android/launcher3/tapl/BaseOverview.java b/tests/tapl/com/android/launcher3/tapl/BaseOverview.java index 6a11336bb9..f47f7105fc 100644 --- a/tests/tapl/com/android/launcher3/tapl/BaseOverview.java +++ b/tests/tapl/com/android/launcher3/tapl/BaseOverview.java @@ -247,8 +247,16 @@ public class BaseOverview extends LauncherInstrumentation.VisibleContainer { return mLauncher.hasLauncherObject(mLauncher.getOverviewObjectSelector("clear_all")); } + protected boolean isActionsViewVisible() { + OverviewTask task = mLauncher.isTablet() ? getFocusedTaskForTablet() : getCurrentTask(); + if (task == null) { + return false; + } + return !task.isTaskSplit(); + } + private void verifyActionsViewVisibility() { - if (!hasTasks()) { + if (!hasTasks() || !isActionsViewVisible()) { return; } try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer( @@ -265,13 +273,11 @@ public class BaseOverview extends LauncherInstrumentation.VisibleContainer { * Returns if focused task is currently snapped task in tablet grid overview. */ private boolean isOverviewSnappedToFocusedTaskForTablet() { - UiObject2 focusedTask = getFocusedTaskForTablet(); + OverviewTask focusedTask = getFocusedTaskForTablet(); if (focusedTask == null) { return false; } - return Math.abs( - focusedTask.getVisibleBounds().exactCenterX() - mLauncher.getExactScreenCenterX()) - < 1; + return Math.abs(focusedTask.getExactCenterX() - mLauncher.getExactScreenCenterX()) < 1; } /** @@ -279,7 +285,7 @@ public class BaseOverview extends LauncherInstrumentation.VisibleContainer { * * @throws IllegalStateException if not run on a tablet device. */ - UiObject2 getFocusedTaskForTablet() { + OverviewTask getFocusedTaskForTablet() { if (!mLauncher.isTablet()) { throw new IllegalStateException("Must be run on tablet device."); } @@ -290,9 +296,9 @@ public class BaseOverview extends LauncherInstrumentation.VisibleContainer { int focusedTaskHeight = mLauncher.getFocusedTaskHeightForTablet(); for (UiObject2 task : taskViews) { if (task.getVisibleBounds().height() == focusedTaskHeight) { - return task; + return new OverviewTask(mLauncher, task, this); } } return null; } -} \ No newline at end of file +} diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index caaeef8c1a..96622cafbe 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -169,6 +169,7 @@ public final class LauncherInstrumentation { private static final String WIDGETS_RES_ID = "primary_widgets_list_view"; private static final String CONTEXT_MENU_RES_ID = "popup_container"; private static final String TASKBAR_RES_ID = "taskbar_view"; + private static final String SPLIT_PLACEHOLDER_RES_ID = "split_placeholder"; public static final int WAIT_TIME_MS = 30000; private static final String SYSTEMUI_PACKAGE = "com.android.systemui"; private static final String ANDROID_PACKAGE = "android"; @@ -724,6 +725,7 @@ public final class LauncherInstrumentation { waitUntilLauncherObjectGone(OVERVIEW_RES_ID); waitUntilLauncherObjectGone(WIDGETS_RES_ID); waitUntilLauncherObjectGone(TASKBAR_RES_ID); + waitUntilLauncherObjectGone(SPLIT_PLACEHOLDER_RES_ID); return waitForLauncherObject(WORKSPACE_RES_ID); } @@ -732,6 +734,7 @@ public final class LauncherInstrumentation { waitUntilLauncherObjectGone(APPS_RES_ID); waitUntilLauncherObjectGone(OVERVIEW_RES_ID); waitUntilLauncherObjectGone(TASKBAR_RES_ID); + waitUntilLauncherObjectGone(SPLIT_PLACEHOLDER_RES_ID); return waitForLauncherObject(WIDGETS_RES_ID); } @@ -741,16 +744,26 @@ public final class LauncherInstrumentation { waitUntilLauncherObjectGone(OVERVIEW_RES_ID); waitUntilLauncherObjectGone(WIDGETS_RES_ID); waitUntilLauncherObjectGone(TASKBAR_RES_ID); + waitUntilLauncherObjectGone(SPLIT_PLACEHOLDER_RES_ID); return waitForLauncherObject(APPS_RES_ID); } - case OVERVIEW: + case OVERVIEW: { + waitUntilLauncherObjectGone(APPS_RES_ID); + waitUntilLauncherObjectGone(WORKSPACE_RES_ID); + waitUntilLauncherObjectGone(WIDGETS_RES_ID); + waitUntilLauncherObjectGone(TASKBAR_RES_ID); + waitUntilLauncherObjectGone(SPLIT_PLACEHOLDER_RES_ID); + + return waitForLauncherObject(OVERVIEW_RES_ID); + } case SPLIT_SCREEN_SELECT: { waitUntilLauncherObjectGone(APPS_RES_ID); waitUntilLauncherObjectGone(WORKSPACE_RES_ID); waitUntilLauncherObjectGone(WIDGETS_RES_ID); waitUntilLauncherObjectGone(TASKBAR_RES_ID); + waitForLauncherObject(SPLIT_PLACEHOLDER_RES_ID); return waitForLauncherObject(OVERVIEW_RES_ID); } case FALLBACK_OVERVIEW: { @@ -758,6 +771,7 @@ public final class LauncherInstrumentation { waitUntilLauncherObjectGone(WORKSPACE_RES_ID); waitUntilLauncherObjectGone(WIDGETS_RES_ID); waitUntilLauncherObjectGone(TASKBAR_RES_ID); + waitUntilLauncherObjectGone(SPLIT_PLACEHOLDER_RES_ID); return waitForFallbackLauncherObject(OVERVIEW_RES_ID); } @@ -766,6 +780,7 @@ public final class LauncherInstrumentation { waitUntilLauncherObjectGone(APPS_RES_ID); waitUntilLauncherObjectGone(OVERVIEW_RES_ID); waitUntilLauncherObjectGone(WIDGETS_RES_ID); + waitUntilLauncherObjectGone(SPLIT_PLACEHOLDER_RES_ID); if (isTablet() && !isFallbackOverview()) { waitForLauncherObject(TASKBAR_RES_ID); diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java index 72a39df6c3..0752e1e91b 100644 --- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java @@ -20,6 +20,7 @@ import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CH import android.graphics.Rect; +import androidx.annotation.NonNull; import androidx.test.uiautomator.By; import androidx.test.uiautomator.BySelector; import androidx.test.uiautomator.UiObject2; @@ -67,6 +68,10 @@ public final class OverviewTask { return mTask.getVisibleCenter().x; } + float getExactCenterX() { + return mTask.getVisibleBounds().exactCenterX(); + } + /** * Dismisses the task by swiping up. */ @@ -159,4 +164,24 @@ public final class OverviewTask { } } } + + /** Taps the task menu. */ + @NonNull + public OverviewTaskMenu tapMenu() { + try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); + LauncherInstrumentation.Closable c = mLauncher.addContextLayer( + "want to tap the task menu")) { + mLauncher.clickLauncherObject( + mLauncher.waitForObjectInContainer(mTask.getParent(), "icon")); + + try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer( + "tapped the task menu")) { + return new OverviewTaskMenu(mLauncher); + } + } + } + + boolean isTaskSplit() { + return mTask.hasObject(By.res("bottomright_snapshot")); + } } diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java new file mode 100644 index 0000000000..8cdc8a036e --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2022 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 androidx.annotation.NonNull; +import androidx.test.uiautomator.By; +import androidx.test.uiautomator.UiObject2; + +/** Represents the menu of an overview task. */ +public class OverviewTaskMenu { + + private final LauncherInstrumentation mLauncher; + private final UiObject2 mMenu; + + OverviewTaskMenu(LauncherInstrumentation launcher) { + mLauncher = launcher; + + mMenu = mLauncher.waitForLauncherObject("menu_option_layout"); + mLauncher.assertTrue("The overview task menus is not visible", + !mMenu.getVisibleBounds().isEmpty()); + } + + /** Taps the split menu item from the overview task menu. */ + @NonNull + public SplitScreenSelect tapSplitMenuItem() { + try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); + LauncherInstrumentation.Closable c = mLauncher.addContextLayer( + "tap split menu item")) { + mLauncher.clickLauncherObject( + mLauncher.findObjectInContainer(mMenu, By.textStartsWith("Split"))); + + try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer( + "tapped split menu item")) { + return new SplitScreenSelect(mLauncher); + } + } + } +} diff --git a/tests/tapl/com/android/launcher3/tapl/SplitScreenSelect.java b/tests/tapl/com/android/launcher3/tapl/SplitScreenSelect.java index 3cf3ed662f..9fa74e48c2 100644 --- a/tests/tapl/com/android/launcher3/tapl/SplitScreenSelect.java +++ b/tests/tapl/com/android/launcher3/tapl/SplitScreenSelect.java @@ -32,4 +32,10 @@ public class SplitScreenSelect extends Overview { protected ContainerType getContainerType() { return ContainerType.SPLIT_SCREEN_SELECT; } + + @Override + protected boolean isActionsViewVisible() { + // We don't show overview actions in split select state. + return false; + } }