Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d8cfd22 authored by Andras Kloczl's avatar Andras Kloczl Committed by Alex Chau
Browse files

Two panel workspace TAPL follow up CL

 - TODO: enable test in portrait

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

Change-Id: I35c326b7a6c612d2fb66c8b94b810f5131fd58d8
parent 3b7ae6e7
Loading
Loading
Loading
Loading
+136 −71
Original line number Diff line number Diff line
@@ -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);
        });
    }

    @Test
    // TODO(b/197631877) Enable in portrait.
    // @PortraitLandscape
    public void testDragIconToRightPanel() {
        Workspace workspace = mLauncher.getWorkspace();

        mWorkspace.dragIcon(mWorkspace.getHotseatAppIcon("Chrome"), 1);
        workspace.dragIcon(workspace.getHotseatAppIcon("Chrome"), 1);

        executeOnLauncher(launcher -> {
            assertPagesExist(launcher, 0, 1);
@@ -79,43 +79,84 @@ 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);
            assertPagesExist(launcher, 0, 1, 2, 3, 4, 5);
            assertItemsOnPage(launcher, 0, "Play Store");
            assertPageEmpty(launcher, 1);
            assertItemsOnPage(launcher, 2, "Maps");
            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
    public void testDragIconToPage3() {
        if (!mLauncher.isTwoPanels()) {
            return;
        }
    // TODO(b/197631877) Enable in portrait.
    // @PortraitLandscape
    public void testDragIconToPage2() {
        Workspace workspace = mLauncher.getWorkspace();

        workspace.dragIcon(workspace.getWorkspaceAppIcon("Maps"), 2);

        // 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, "Maps");
            assertPageEmpty(launcher, 3);
        });
    }

    @Test
    // TODO(b/197631877) Enable in portrait.
    // @PortraitLandscape
    public void testDragIconToPage3() {
        Workspace workspace = mLauncher.getWorkspace();

        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;
        }

        // Pre verifying the screens
        executeOnLauncher(launcher -> {
            assertPagesExist(launcher, 0, 1);
            assertItemsOnPage(launcher, 0, "Play Store", "Maps");
            assertPageEmpty(launcher, 1);
        });
        Workspace workspace = mLauncher.getWorkspace();

        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;
        }

        // Pre verifying the screens
        executeOnLauncher(launcher -> {
            assertPagesExist(launcher, 0, 1);
            assertItemsOnPage(launcher, 0, "Play Store", "Maps");
            assertPageEmpty(launcher, 1);
        });
        Workspace workspace = mLauncher.getWorkspace();

        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);
+25 −7
Original line number Diff line number Diff line
@@ -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.