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

Commit c9b68b5c authored by Alex Chau's avatar Alex Chau Committed by Android (Google) Code Review
Browse files

Merge "Two panel workspace TAPL follow up CL"

parents c9921d7e 3d8cfd22
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.