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

Commit 06119c9c authored by Ling Wo's avatar Ling Wo Committed by Automerger Merge Worker
Browse files

Merge "delete appIcon from workspace via TAPL" into sc-v2-dev am: 361d8286 am: 7f389d63

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/16189765

Change-Id: I4d2d76c92933e45dab99566e460c4f59804f59e7
parents 61da68ed 7f389d63
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -423,6 +423,18 @@ public class TaplTestsLauncher3 extends AbstractLauncherUiTest {
        waitForState("Launcher internal state didn't switch to Home", () -> LauncherState.NORMAL);
    }

    @Test
    @PortraitLandscape
    public void testDeleteFromWorkspace() throws Exception {
        // test delete both built-in apps and user-installed app from workspace
        for (String appName : new String[] {"Gmail", "Play Store", APP_NAME}) {
            final AppIcon appIcon = createShortcutIfNotExist(appName);
            Workspace workspace = mLauncher.getWorkspace().deleteAppIcon(appIcon);
            assertNull(appName + " app was found after being deleted from workspace",
                    workspace.tryGetWorkspaceAppIcon(appName));
        }
    }

    public static String getAppPackageName() {
        return getInstrumentation().getContext().getPackageName();
    }
+47 −12
Original line number Diff line number Diff line
@@ -1399,14 +1399,15 @@ public final class LauncherInstrumentation {
        final Point start = new Point(startX, startY);
        final Point end = new Point(endX, endY);
        sendPointer(downTime, downTime, MotionEvent.ACTION_DOWN, start, gestureScope);
        final long endTime = movePointer(start, end, steps, downTime, slowDown, gestureScope);
        final long endTime = movePointer(
                start, end, steps, false, downTime, slowDown, gestureScope);
        sendPointer(downTime, endTime, MotionEvent.ACTION_UP, end, gestureScope);
    }

    long movePointer(Point start, Point end, int steps, long downTime, boolean slowDown,
            GestureScope gestureScope) {
        long endTime = movePointer(
                downTime, downTime, steps * GESTURE_STEP_MS, start, end, gestureScope);
    long movePointer(Point start, Point end, int steps, boolean isDecelerating,
            long downTime, boolean slowDown, GestureScope gestureScope) {
        long endTime = movePointer(downTime, downTime, steps * GESTURE_STEP_MS,
                isDecelerating, start, end, gestureScope);
        if (slowDown) {
            endTime = movePointer(downTime, endTime + GESTURE_STEP_MS, 5 * GESTURE_STEP_MS, end,
                    end, gestureScope);
@@ -1485,21 +1486,55 @@ public final class LauncherInstrumentation {

    public long movePointer(long downTime, long startTime, long duration, Point from, Point to,
            GestureScope gestureScope) {
        return movePointer(
                downTime, startTime, duration, false, from, to, gestureScope);
    }

    public long movePointer(long downTime, long startTime, long duration, boolean isDecelerating,
            Point from, Point to, GestureScope gestureScope) {
        log("movePointer: " + from + " to " + to);
        final Point point = new Point();
        long steps = duration / GESTURE_STEP_MS;

        long currentTime = startTime;

        if (isDecelerating) {
            // formula: V = V0 - D*T, assuming V = 0 when T = duration

            // vx0: initial speed at the x-dimension, set as twice the avg speed
            // dx: the constant deceleration at the x-dimension
            double vx0 = 2 * (to.x - from.x) / duration;
            double dx = vx0 / duration;
            // vy0: initial speed at the y-dimension, set as twice the avg speed
            // dy: the constant deceleration at the y-dimension
            double vy0 = 2 * (to.y - from.y) / duration;
            double dy = vy0 / duration;

            for (long i = 0; i < steps; ++i) {
                sleep(GESTURE_STEP_MS);
                currentTime += GESTURE_STEP_MS;

                // formula: P = P0 + V0*T - (D*T^2/2)
                final double t = (i + 1) * GESTURE_STEP_MS;
                point.x = from.x + (int) (vx0 * t - 0.5 * dx * t * t);
                point.y = from.y + (int) (vy0 * t - 0.5 * dy * t * t);

                sendPointer(downTime, currentTime, MotionEvent.ACTION_MOVE, point, gestureScope);
            }
        } else {
            for (long i = 0; i < steps; ++i) {
                sleep(GESTURE_STEP_MS);
                currentTime += GESTURE_STEP_MS;
            final float progress = (currentTime - startTime) / (float) duration;

                final float progress = (currentTime - startTime) / (float) duration;
                point.x = from.x + (int) (progress * (to.x - from.x));
                point.y = from.y + (int) (progress * (to.y - from.y));

                sendPointer(downTime, currentTime, MotionEvent.ACTION_MOVE, point, gestureScope);

            }
        }

        return currentTime;
    }

+46 −9
Original line number Diff line number Diff line
@@ -46,6 +46,9 @@ import java.util.stream.Collectors;
 */
public final class Workspace extends Home {
    private static final int FLING_STEPS = 10;
    private static final int DEFAULT_DRAG_STEPS = 10;
    private static final String DROP_BAR_RES_ID = "drop_target_bar";
    private static final String DELETE_TARGET_TEXT_ID = "delete_target_text";

    static final Pattern EVENT_CTRL_W_DOWN = Pattern.compile(
            "Key event: KeyEvent.*?action=ACTION_DOWN.*?keyCode=KEYCODE_W"
@@ -211,6 +214,40 @@ public final class Workspace extends Home {
                TestProtocol.TEST_INFO_RESPONSE_FIELD);
    }

    /*
     * Get the center point of the delete icon in the drop target bar.
     */
    private Point getDeleteDropPoint() {
        return mLauncher.waitForObjectInContainer(
                mLauncher.waitForLauncherObject(DROP_BAR_RES_ID),
                DELETE_TARGET_TEXT_ID).getVisibleCenter();
    }

    /**
     * Delete the appIcon from the workspace.
     *
     * @param appIcon to be deleted.
     * @return validated workspace after the existing appIcon being deleted.
     */
    public Workspace deleteAppIcon(AppIcon appIcon) {
        try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck();
             LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
                     "removing app icon from workspace")) {
            dragIconToWorkspace(
                    mLauncher, appIcon,
                    () -> getDeleteDropPoint(),
                    true, /* decelerating */
                    appIcon.getLongPressIndicator(),
                    () -> mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, LONG_CLICK_EVENT),
                    null);

            try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer(
                    "dragged the app to the drop bar")) {
                return new Workspace(mLauncher);
            }
        }
    }

    /**
     * Finds folder icons in the current workspace.
     *
@@ -241,8 +278,8 @@ public final class Workspace extends Home {
            expectLongClickEvents.run();
            launcher.waitForLauncherObject(longPressIndicator);
            LauncherInstrumentation.log("dragIconToSpringLoaded: indicator");
            launcher.movePointer(iconCenter, dragStartCenter, 10, downTime, true,
                    LauncherInstrumentation.GestureScope.INSIDE);
            launcher.movePointer(iconCenter, dragStartCenter, DEFAULT_DRAG_STEPS, false,
                    downTime, true, LauncherInstrumentation.GestureScope.INSIDE);
        }, SPRING_LOADED_STATE_ORDINAL, "long-pressing and triggering drag start");
        return dragStartCenter;
    }
@@ -270,7 +307,7 @@ public final class Workspace extends Home {
            expectDropEvents = () -> launcher.expectEvent(TestProtocol.SEQUENCE_MAIN,
                    LauncherInstrumentation.EVENT_START);
        }
        dragIconToWorkspace(launcher, launchable, () -> dest, longPressIndicator,
        dragIconToWorkspace(launcher, launchable, () -> dest, false, longPressIndicator,
                expectLongClickEvents, expectDropEvents);
    }

@@ -280,13 +317,13 @@ public final class Workspace extends Home {
     */
    static void dragIconToWorkspace(LauncherInstrumentation launcher, Launchable launchable,
            Supplier<Point> destSupplier, String longPressIndicator) {
        dragIconToWorkspace(launcher, launchable, destSupplier, longPressIndicator,
        dragIconToWorkspace(launcher, launchable, destSupplier, false, longPressIndicator,
                () -> launcher.expectEvent(TestProtocol.SEQUENCE_MAIN, LONG_CLICK_EVENT), null);
    }

    static void dragIconToWorkspace(
            LauncherInstrumentation launcher, Launchable launchable, Supplier<Point> dest,
            String longPressIndicator, Runnable expectLongClickEvents,
            boolean isDecelerating, String longPressIndicator, Runnable expectLongClickEvents,
            @Nullable Runnable expectDropEvents) {
        try (LauncherInstrumentation.Closable ignored = launcher.addContextLayer(
                "want to drag icon to workspace")) {
@@ -301,8 +338,8 @@ 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, 10, downTime, true,
                        LauncherInstrumentation.GestureScope.INSIDE);
                launcher.movePointer(dragStart, screenEdge, DEFAULT_DRAG_STEPS, isDecelerating,
                        downTime, true, LauncherInstrumentation.GestureScope.INSIDE);
                launcher.waitForIdle(); // Wait for the page change to happen
                targetDest.x += displayX * (targetDest.x > 0 ? -1 : 1);
                dragStart = screenEdge;
@@ -310,8 +347,8 @@ public final class Workspace extends Home {

            // targetDest.x is now between 0 and displayX so we found the target page,
            // we just have to put move the icon to the destination and drop it
            launcher.movePointer(dragStart, targetDest, 10, downTime, true,
                    LauncherInstrumentation.GestureScope.INSIDE);
            launcher.movePointer(dragStart, targetDest, DEFAULT_DRAG_STEPS, isDecelerating,
                    downTime, true, LauncherInstrumentation.GestureScope.INSIDE);
            dropDraggedIcon(launcher, targetDest, downTime, expectDropEvents);
        }
    }