Two panel workspace TAPL follow up CL

- TODO: enable test in portrait

Test: TwoPanelWorkspaceTest
Former CL: http://ag/16357467
Bug: 197631877

Change-Id: I35c326b7a6c612d2fb66c8b94b810f5131fd58d8
This commit is contained in:
Andras Kloczl
2021-12-10 13:53:59 +00:00
committed by Alex Chau
parent 3b7ae6e723
commit 3d8cfd22a1
2 changed files with 162 additions and 79 deletions
@@ -19,6 +19,7 @@ package com.android.launcher3.ui.workspace;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
@@ -47,20 +48,12 @@ import java.util.stream.Collectors;
@RunWith(AndroidJUnit4.class)
public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
Workspace mWorkspace;
@Before
public void setUp() throws Exception {
super.setUp();
TaplTestsLauncher3.initialize(this);
mWorkspace = mLauncher.getWorkspace();
}
@Test
public void testDragIconToRightPanel() {
if (!mLauncher.isTwoPanels()) {
return;
}
assumeTrue(mLauncher.isTwoPanels());
// Pre verifying the screens
executeOnLauncher(launcher -> {
@@ -68,8 +61,15 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
assertItemsOnPage(launcher, 0, "Play Store", "Maps");
assertPageEmpty(launcher, 1);
});
}
mWorkspace.dragIcon(mWorkspace.getHotseatAppIcon("Chrome"), 1);
@Test
// TODO(b/197631877) Enable in portrait.
// @PortraitLandscape
public void testDragIconToRightPanel() {
Workspace workspace = mLauncher.getWorkspace();
workspace.dragIcon(workspace.getHotseatAppIcon("Chrome"), 1);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1);
@@ -79,19 +79,67 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
}
@Test
public void testDragIconToPage2() {
if (!mLauncher.isTwoPanels()) {
return;
}
// TODO(b/197631877) Enable in portrait.
// @PortraitLandscape
public void testSinglePageDragIconWhenMultiplePageScrollingIsPossible() {
Workspace workspace = mLauncher.getWorkspace();
workspace.dragIcon(workspace.getHotseatAppIcon("Chrome"), 2);
workspace.flingBackward();
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), 3);
// Pre verifying the screens
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1);
assertItemsOnPage(launcher, 0, "Play Store", "Maps");
assertPagesExist(launcher, 0, 1, 2, 3);
assertItemsOnPage(launcher, 0, "Play Store");
assertPageEmpty(launcher, 1);
assertItemsOnPage(launcher, 2, "Chrome");
assertItemsOnPage(launcher, 3, "Maps");
});
mWorkspace.dragIcon(mWorkspace.getWorkspaceAppIcon("Maps"), 2);
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), 3);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 2, 3, 4, 5);
assertItemsOnPage(launcher, 0, "Play Store");
assertPageEmpty(launcher, 1);
assertItemsOnPage(launcher, 2, "Chrome");
assertPageEmpty(launcher, 3);
assertPageEmpty(launcher, 4);
assertItemsOnPage(launcher, 5, "Maps");
});
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), -1);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 2, 3);
assertItemsOnPage(launcher, 0, "Play Store");
assertPageEmpty(launcher, 1);
assertItemsOnPage(launcher, 2, "Chrome");
assertItemsOnPage(launcher, 3, "Maps");
});
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), -1);
workspace.flingForward();
workspace.dragIcon(workspace.getWorkspaceAppIcon("Chrome"), -2);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1);
assertItemsOnPage(launcher, 0, "Chrome", "Play Store");
assertItemsOnPage(launcher, 1, "Maps");
});
}
@Test
// TODO(b/197631877) Enable in portrait.
// @PortraitLandscape
public void testDragIconToPage2() {
Workspace workspace = mLauncher.getWorkspace();
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), 2);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 2, 3);
@@ -103,19 +151,12 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
}
@Test
// TODO(b/197631877) Enable in portrait.
// @PortraitLandscape
public void testDragIconToPage3() {
if (!mLauncher.isTwoPanels()) {
return;
}
Workspace workspace = mLauncher.getWorkspace();
// Pre verifying the screens
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1);
assertItemsOnPage(launcher, 0, "Play Store", "Maps");
assertPageEmpty(launcher, 1);
});
mWorkspace.dragIcon(mWorkspace.getHotseatAppIcon("Phone"), 3);
workspace.dragIcon(workspace.getHotseatAppIcon("Phone"), 3);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 2, 3);
@@ -126,22 +167,61 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
});
}
@Test
public void testEmptyPageDoesNotGetRemovedIfPagePairIsNotEmpty() {
if (!mLauncher.isTwoPanels()) {
return;
}
// TODO(b/197631877) Enable in portrait.
// @PortraitLandscape
public void testMultiplePageDragIcon() {
Workspace workspace = mLauncher.getWorkspace();
workspace.dragIcon(workspace.getHotseatAppIcon("Messages"), 2);
workspace.flingBackward();
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), 5);
// Pre verifying the screens
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1);
assertItemsOnPage(launcher, 0, "Play Store", "Maps");
assertPagesExist(launcher, 0, 1, 2, 3, 4, 5);
assertItemsOnPage(launcher, 0, "Play Store");
assertPageEmpty(launcher, 1);
assertItemsOnPage(launcher, 2, "Messages");
assertPageEmpty(launcher, 3);
assertPageEmpty(launcher, 4);
assertItemsOnPage(launcher, 5, "Maps");
});
mWorkspace.dragIcon(mWorkspace.getWorkspaceAppIcon("Maps"), 3);
mWorkspace.dragIcon(mWorkspace.getHotseatAppIcon("Chrome"), 0);
workspace.flingBackward();
workspace.dragIcon(workspace.getWorkspaceAppIcon("Messages"), 4);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 4, 5, 6, 7);
assertItemsOnPage(launcher, 0, "Play Store");
assertPageEmpty(launcher, 1);
assertPageEmpty(launcher, 4);
assertItemsOnPage(launcher, 5, "Maps");
assertItemsOnPage(launcher, 6, "Messages");
assertPageEmpty(launcher, 7);
});
workspace.dragIcon(workspace.getWorkspaceAppIcon("Messages"), -3);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 4, 5);
assertItemsOnPage(launcher, 0, "Play Store");
assertItemsOnPage(launcher, 1, "Messages");
assertPageEmpty(launcher, 4);
assertItemsOnPage(launcher, 5, "Maps");
});
}
@Test
// TODO(b/197631877) Enable in portrait.
// @PortraitLandscape
public void testEmptyPageDoesNotGetRemovedIfPagePairIsNotEmpty() {
Workspace workspace = mLauncher.getWorkspace();
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), 3);
workspace.dragIcon(workspace.getHotseatAppIcon("Chrome"), 0);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 2, 3);
@@ -151,7 +231,7 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
assertItemsOnPage(launcher, 3, "Maps");
});
mWorkspace.dragIcon(mWorkspace.getWorkspaceAppIcon("Maps"), -1);
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), -1);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 2, 3);
@@ -163,8 +243,8 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
// Move Chrome to the right panel as well, to make sure pages are not deleted whichever
// page is the empty one
mWorkspace.flingForward();
mWorkspace.dragIcon(mWorkspace.getWorkspaceAppIcon("Chrome"), 1);
workspace.flingForward();
workspace.dragIcon(workspace.getWorkspaceAppIcon("Chrome"), 1);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 2, 3);
@@ -175,22 +255,14 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
});
}
@Test
// TODO(b/197631877) Enable in portrait.
// @PortraitLandscape
public void testEmptyPagesGetRemovedIfBothPagesAreEmpty() {
if (!mLauncher.isTwoPanels()) {
return;
}
Workspace workspace = mLauncher.getWorkspace();
// Pre verifying the screens
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1);
assertItemsOnPage(launcher, 0, "Play Store", "Maps");
assertPageEmpty(launcher, 1);
});
mWorkspace.dragIcon(mWorkspace.getWorkspaceAppIcon("Play Store"), 2);
mWorkspace.dragIcon(mWorkspace.getHotseatAppIcon("Camera"), 1);
workspace.dragIcon(workspace.getWorkspaceAppIcon("Play Store"), 2);
workspace.dragIcon(workspace.getHotseatAppIcon("Camera"), 1);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 2, 3);
@@ -200,9 +272,9 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
assertItemsOnPage(launcher, 3, "Camera");
});
mWorkspace.dragIcon(mWorkspace.getWorkspaceAppIcon("Camera"), -1);
mWorkspace.flingForward();
mWorkspace.dragIcon(mWorkspace.getWorkspaceAppIcon("Play Store"), -2);
workspace.dragIcon(workspace.getWorkspaceAppIcon("Camera"), -1);
workspace.flingForward();
workspace.dragIcon(workspace.getWorkspaceAppIcon("Play Store"), -2);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1);
@@ -212,20 +284,13 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
}
@Test
// TODO(b/197631877) Enable in portrait.
// @PortraitLandscape
public void testMiddleEmptyPagesGetRemoved() {
if (!mLauncher.isTwoPanels()) {
return;
}
Workspace workspace = mLauncher.getWorkspace();
// Pre verifying the screens
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1);
assertItemsOnPage(launcher, 0, "Play Store", "Maps");
assertPageEmpty(launcher, 1);
});
mWorkspace.dragIcon(mWorkspace.getWorkspaceAppIcon("Maps"), 2);
mWorkspace.dragIcon(mWorkspace.getHotseatAppIcon("Messages"), 3);
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), 2);
workspace.dragIcon(workspace.getHotseatAppIcon("Messages"), 3);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 2, 3, 4, 5);
@@ -237,8 +302,8 @@ public class TwoPanelWorkspaceTest extends AbstractLauncherUiTest {
assertItemsOnPage(launcher, 5, "Messages");
});
mWorkspace.flingBackward();
mWorkspace.dragIcon(mWorkspace.getWorkspaceAppIcon("Maps"), 2);
workspace.flingBackward();
workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), 2);
executeOnLauncher(launcher -> {
assertPagesExist(launcher, 0, 1, 4, 5);
@@ -16,6 +16,8 @@
package com.android.launcher3.tapl;
import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_SCROLLED;
import static com.android.launcher3.testing.TestProtocol.ALL_APPS_STATE_ORDINAL;
import static com.android.launcher3.testing.TestProtocol.NORMAL_STATE_ORDINAL;
import static com.android.launcher3.testing.TestProtocol.SPRING_LOADED_STATE_ORDINAL;
@@ -165,15 +167,22 @@ public final class Workspace extends Home {
}
/**
* Drags an icon to the (currentPage + pageDelta) page if the page already exists.
* If the target page doesn't exist, the icon will be put onto an existing page that is the
* closest to the target page.
* Drags an icon to the (currentPage + pageDelta) page.
* If the target page doesn't exist yet, a new page will be created.
* In case the target page can't be created (e.g. existing pages are 0, 1, current: 0,
* pageDelta: 3, the latest page that can be created is 2) the icon will be dragged onto the
* page that can be created and is closest to the target page.
*
* @param appIcon - icon to drag.
* @param pageDelta - how many pages should the icon be dragged from the current page.
* It can be a negative value.
* It can be a negative value. currentPage + pageDelta should be greater
* than or equal to 0.
*/
public void dragIcon(AppIcon appIcon, int pageDelta) {
if (mHotseat.getVisibleBounds().height() > mHotseat.getVisibleBounds().width()) {
throw new UnsupportedOperationException(
"dragIcon does NOT support dragging when the hotseat is on the side.");
}
try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) {
final UiObject2 workspace = verifyActiveContainer();
try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
@@ -338,9 +347,11 @@ public final class Workspace extends Home {
while (targetDest.x > displayX || targetDest.x < 0) {
int edgeX = targetDest.x > 0 ? displayX : 0;
Point screenEdge = new Point(edgeX, targetDest.y);
launcher.movePointer(dragStart, screenEdge, DEFAULT_DRAG_STEPS, isDecelerating,
downTime, true, LauncherInstrumentation.GestureScope.INSIDE);
launcher.waitForIdle(); // Wait for the page change to happen
Point finalDragStart = dragStart;
executeAndWaitForPageScroll(launcher,
() -> launcher.movePointer(finalDragStart, screenEdge, DEFAULT_DRAG_STEPS,
isDecelerating, downTime, true,
LauncherInstrumentation.GestureScope.INSIDE));
targetDest.x += displayX * (targetDest.x > 0 ? -1 : 1);
dragStart = screenEdge;
}
@@ -353,6 +364,13 @@ public final class Workspace extends Home {
}
}
private static void executeAndWaitForPageScroll(LauncherInstrumentation launcher,
Runnable command) {
launcher.executeAndWaitForEvent(command,
event -> event.getEventType() == TYPE_VIEW_SCROLLED,
() -> "Page scroll didn't happen", "Scrolling page");
}
/**
* Flings to get to screens on the right. Waits for scrolling and a possible overscroll
* recoil to complete.