Merge "Revert "Converting even more tests to TAPL"" into ub-launcher3-qt-dev

am: 1703eb8b88

Change-Id: I570fadb5ff452f4363c4acddb3079ec076c14b71
This commit is contained in:
Vadim Tryshev
2019-06-26 17:38:13 -07:00
committed by android-build-merger
9 changed files with 202 additions and 63 deletions
@@ -20,6 +20,7 @@ import static androidx.test.InstrumentationRegistry.getInstrumentation;
import static com.android.launcher3.ui.TaplTestsLauncher3.getAppPackageName;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static java.lang.System.exit;
@@ -37,7 +38,10 @@ import android.util.Log;
import androidx.test.InstrumentationRegistry;
import androidx.test.uiautomator.By;
import androidx.test.uiautomator.BySelector;
import androidx.test.uiautomator.Direction;
import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.UiObject2;
import androidx.test.uiautomator.Until;
import com.android.launcher3.Launcher;
@@ -46,6 +50,7 @@ import com.android.launcher3.LauncherModel;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.LauncherState;
import com.android.launcher3.MainThreadExecutor;
import com.android.launcher3.ResourceUtils;
import com.android.launcher3.Utilities;
import com.android.launcher3.compat.LauncherAppsCompat;
import com.android.launcher3.model.AppLaunchTracker;
@@ -81,6 +86,7 @@ public abstract class AbstractLauncherUiTest {
public static final long DEFAULT_ACTIVITY_TIMEOUT = TimeUnit.SECONDS.toMillis(10);
public static final long DEFAULT_BROADCAST_TIMEOUT_SECS = 5;
public static final long SHORT_UI_TIMEOUT = 300;
public static final long DEFAULT_UI_TIMEOUT = 10000;
private static final String TAG = "AbstractLauncherUiTest";
@@ -174,6 +180,31 @@ public abstract class AbstractLauncherUiTest {
}
}
/**
* Scrolls the {@param container} until it finds an object matching {@param condition}.
*
* @return the matching object.
*/
protected UiObject2 scrollAndFind(UiObject2 container, BySelector condition) {
final int margin = ResourceUtils.getNavbarSize(
ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, mLauncher.getResources()) + 1;
container.setGestureMargins(0, 0, 0, margin);
int i = 0;
for (; ; ) {
// findObject can only execute after spring settles.
mDevice.wait(Until.findObject(condition), SHORT_UI_TIMEOUT);
UiObject2 widget = container.findObject(condition);
if (widget != null && widget.getVisibleBounds().intersects(
0, 0, mDevice.getDisplayWidth(),
mDevice.getDisplayHeight() - margin)) {
return widget;
}
if (++i > 40) fail("Too many attempts");
container.scroll(Direction.DOWN, 1f);
}
}
/**
* Removes all icons from homescreen and hotseat.
*/
@@ -216,8 +216,7 @@ public class TaplTestsLauncher3 extends AbstractLauncherUiTest {
final AppIcon app = allApps.getAppIcon("TestActivity7");
assertNotNull("AppIcon.launch returned null", app.launch(getAppPackageName()));
test.executeOnLauncher(launcher -> assertTrue(
"Launcher activity is the top activity; expecting another activity to be the "
+ "top "
"Launcher activity is the top activity; expecting another activity to be the top "
+ "one",
test.isInBackground(launcher)));
} finally {
@@ -305,8 +304,11 @@ public class TaplTestsLauncher3 extends AbstractLauncherUiTest {
switchToAllApps();
allApps.freeze();
try {
allApps.getAppIcon(APP_NAME).dragToWorkspace();
mLauncher.getWorkspace().getWorkspaceAppIcon(APP_NAME).launch(getAppPackageName());
allApps.
getAppIcon(APP_NAME).
dragToWorkspace().
getWorkspaceAppIcon(APP_NAME).
launch(getAppPackageName());
} finally {
allApps.unfreeze();
}
@@ -333,8 +335,13 @@ public class TaplTestsLauncher3 extends AbstractLauncherUiTest {
getMenuItem(0);
final String shortcutName = menuItem.getText();
menuItem.dragToWorkspace();
mLauncher.getWorkspace().getWorkspaceAppIcon(shortcutName).launch(getAppPackageName());
// 4. Drag the first shortcut to the home screen.
// 5. Verify that the shortcut works on home screen
// (the app opens and has the same text as the shortcut).
menuItem.
dragToWorkspace().
getWorkspaceAppIcon(shortcutName).
launch(getAppPackageName());
} finally {
allApps.unfreeze();
}
@@ -18,15 +18,28 @@ package com.android.launcher3.ui;
import static androidx.test.InstrumentationRegistry.getInstrumentation;
import static androidx.test.InstrumentationRegistry.getTargetContext;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import android.content.ComponentName;
import android.content.Context;
import android.graphics.Point;
import android.os.Process;
import android.os.SystemClock;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.test.uiautomator.By;
import androidx.test.uiautomator.BySelector;
import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.UiObject2;
import androidx.test.uiautomator.Until;
import com.android.launcher3.LauncherAppWidgetProviderInfo;
import com.android.launcher3.R;
import com.android.launcher3.compat.AppWidgetManagerCompat;
import com.android.launcher3.testcomponent.AppWidgetNoConfig;
import com.android.launcher3.testcomponent.AppWidgetWithConfig;
@@ -37,6 +50,21 @@ import java.util.function.Function;
public class TestViewHelpers {
private static final String TAG = "TestViewHelpers";
private static UiDevice getDevice() {
return UiDevice.getInstance(getInstrumentation());
}
public static UiObject2 findViewById(int id) {
return getDevice().wait(Until.findObject(getSelectorForId(id)),
AbstractLauncherUiTest.DEFAULT_UI_TIMEOUT);
}
public static BySelector getSelectorForId(int id) {
final Context targetContext = getTargetContext();
String name = targetContext.getResources().getResourceEntryName(id);
return By.res(targetContext.getPackageName(), name);
}
/**
* Finds a widget provider which can fit on the home screen.
*
@@ -63,6 +91,92 @@ public class TestViewHelpers {
return info;
}
/**
* Drags an icon to the center of homescreen.
*
* @param icon object that is either app icon or shortcut icon
*/
public static void dragToWorkspace(UiObject2 icon, boolean expectedToShowShortcuts) {
Point center = icon.getVisibleCenter();
// Action Down
final long downTime = SystemClock.uptimeMillis();
sendPointer(downTime, MotionEvent.ACTION_DOWN, center);
UiObject2 dragLayer = findViewById(R.id.drag_layer);
if (expectedToShowShortcuts) {
// Make sure shortcuts show up, and then move a bit to hide them.
assertNotNull(findViewById(R.id.deep_shortcuts_container));
Point moveLocation = new Point(center);
int distanceToMove =
getTargetContext().getResources().getDimensionPixelSize(
R.dimen.deep_shortcuts_start_drag_threshold) + 50;
if (moveLocation.y - distanceToMove >= dragLayer.getVisibleBounds().top) {
moveLocation.y -= distanceToMove;
} else {
moveLocation.y += distanceToMove;
}
movePointer(downTime, center, moveLocation);
assertNull(findViewById(R.id.deep_shortcuts_container));
}
// Wait until Remove/Delete target is visible
assertNotNull(findViewById(R.id.delete_target_text));
Point moveLocation = dragLayer.getVisibleCenter();
// Move to center
movePointer(downTime, center, moveLocation);
sendPointer(downTime, MotionEvent.ACTION_UP, moveLocation);
// Wait until remove target is gone.
getDevice().wait(Until.gone(getSelectorForId(R.id.delete_target_text)),
AbstractLauncherUiTest.DEFAULT_UI_TIMEOUT);
}
private static void movePointer(long downTime, Point from, Point to) {
while (!from.equals(to)) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
from.x = getNextMoveValue(to.x, from.x);
from.y = getNextMoveValue(to.y, from.y);
sendPointer(downTime, MotionEvent.ACTION_MOVE, from);
}
}
private static int getNextMoveValue(int targetValue, int oldValue) {
if (targetValue - oldValue > 10) {
return oldValue + 10;
} else if (targetValue - oldValue < -10) {
return oldValue - 10;
} else {
return targetValue;
}
}
public static void sendPointer(long downTime, int action, Point point) {
MotionEvent event = MotionEvent.obtain(downTime,
SystemClock.uptimeMillis(), action, point.x, point.y, 0);
getInstrumentation().sendPointerSync(event);
event.recycle();
}
/**
* Opens widget tray and returns the recycler view.
*/
public static UiObject2 openWidgetsTray() {
final UiDevice device = getDevice();
device.pressKeyCode(KeyEvent.KEYCODE_W, KeyEvent.META_CTRL_ON);
device.waitForIdle();
return findViewById(R.id.widgets_list_view);
}
public static View findChildView(ViewGroup parent, Function<View, Boolean> condition) {
for (int i = 0; i < parent.getChildCount(); ++i) {
final View child = parent.getChildAt(i);
@@ -27,18 +27,20 @@ import android.view.View;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import androidx.test.uiautomator.By;
import androidx.test.uiautomator.UiObject2;
import com.android.launcher3.ItemInfo;
import com.android.launcher3.LauncherAppWidgetInfo;
import com.android.launcher3.LauncherAppWidgetProviderInfo;
import com.android.launcher3.Workspace;
import com.android.launcher3.tapl.Widgets;
import com.android.launcher3.testcomponent.WidgetConfigActivity;
import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.ui.TestViewHelpers;
import com.android.launcher3.util.Condition;
import com.android.launcher3.util.Wait;
import com.android.launcher3.util.rule.ShellCommandRule;
import com.android.launcher3.widget.WidgetCell;
import org.junit.Before;
import org.junit.Ignore;
@@ -69,6 +71,7 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest {
}
@Test
// Convert test to TAPL b/131116002
public void testWidgetConfig() throws Throwable {
runTest(false, true);
}
@@ -80,6 +83,7 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest {
}
@Test
// Convert test to TAPL b/131116002
public void testConfigCancelled() throws Throwable {
runTest(false, false);
}
@@ -100,13 +104,15 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest {
clearHomescreen();
mActivityMonitor.startLauncher();
final Widgets widgets = mLauncher.getWorkspace().openAllWidgets();
// Open widget tray and wait for load complete.
final UiObject2 widgetContainer = TestViewHelpers.openWidgetsTray();
Wait.atMost(null, Condition.minChildCount(widgetContainer, 2), DEFAULT_UI_TIMEOUT);
// Drag widget to homescreen
WidgetConfigStartupMonitor monitor = new WidgetConfigStartupMonitor();
widgets.
getWidget(mWidgetInfo.getLabel(mTargetContext.getPackageManager())).
dragToWorkspace();
UiObject2 widget = scrollAndFind(widgetContainer, By.clazz(WidgetCell.class)
.hasDescendant(By.text(mWidgetInfo.getLabel(mTargetContext.getPackageManager()))));
TestViewHelpers.dragToWorkspace(widget, false);
// Widget id for which the config activity was opened
mWidgetId = monitor.getWidgetId();
@@ -19,12 +19,20 @@ import static org.junit.Assert.assertTrue;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import androidx.test.uiautomator.By;
import androidx.test.uiautomator.UiObject2;
import android.view.View;
import com.android.launcher3.ItemInfo;
import com.android.launcher3.LauncherAppWidgetInfo;
import com.android.launcher3.LauncherAppWidgetProviderInfo;
import com.android.launcher3.Workspace.ItemOperator;
import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.ui.TestViewHelpers;
import com.android.launcher3.util.Condition;
import com.android.launcher3.util.Wait;
import com.android.launcher3.util.rule.ShellCommandRule;
import com.android.launcher3.widget.WidgetCell;
import org.junit.Ignore;
import org.junit.Rule;
@@ -53,6 +61,7 @@ public class AddWidgetTest extends AbstractLauncherUiTest {
performTest();
}
// Convert to TAPL b/131116002
private void performTest() throws Throwable {
clearHomescreen();
mActivityMonitor.startLauncher();
@@ -60,15 +69,22 @@ public class AddWidgetTest extends AbstractLauncherUiTest {
final LauncherAppWidgetProviderInfo widgetInfo =
TestViewHelpers.findWidgetProvider(this, false /* hasConfigureScreen */);
mLauncher.
getWorkspace().
openAllWidgets().
getWidget(widgetInfo.getLabel(mTargetContext.getPackageManager())).
dragToWorkspace();
// Open widget tray and wait for load complete.
final UiObject2 widgetContainer = TestViewHelpers.openWidgetsTray();
Wait.atMost(null, Condition.minChildCount(widgetContainer, 2), DEFAULT_UI_TIMEOUT);
assertTrue(mActivityMonitor.itemExists(
(info, view) -> info instanceof LauncherAppWidgetInfo &&
// Drag widget to homescreen
UiObject2 widget = scrollAndFind(widgetContainer, By.clazz(WidgetCell.class)
.hasDescendant(By.text(widgetInfo.getLabel(mTargetContext.getPackageManager()))));
TestViewHelpers.dragToWorkspace(widget, false);
assertTrue(mActivityMonitor.itemExists(new ItemOperator() {
@Override
public boolean evaluate(ItemInfo info, View view) {
return info instanceof LauncherAppWidgetInfo &&
((LauncherAppWidgetInfo) info).providerName.getClassName().equals(
widgetInfo.provider.getClassName())).call());
widgetInfo.provider.getClassName());
}
}).call());
}
}
@@ -68,7 +68,7 @@ abstract class Launchable {
/**
* Drags an object to the center of homescreen.
*/
public void dragToWorkspace() {
public Workspace dragToWorkspace() {
final Point launchableCenter = getObject().getVisibleCenter();
final Point displaySize = mLauncher.getRealDisplaySize();
final int width = displaySize.x / 2;
@@ -80,6 +80,10 @@ abstract class Launchable {
launchableCenter.x - width / 2 : launchableCenter.x + width / 2,
displaySize.y / 2),
getLongPressIndicator());
try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
"dragged launchable to workspace")) {
return new Workspace(mLauncher);
}
}
protected abstract String getLongPressIndicator();
@@ -614,12 +614,12 @@ public final class LauncherInstrumentation {
@NonNull
UiObject2 waitForLauncherObject(BySelector selector) {
return waitForObjectBySelector(By.copy(selector).pkg(getLauncherPackageName()));
return waitForObjectBySelector(selector.pkg(getLauncherPackageName()));
}
@NonNull
UiObject2 tryWaitForLauncherObject(BySelector selector, long timeout) {
return tryWaitForObjectBySelector(By.copy(selector).pkg(getLauncherPackageName()), timeout);
return tryWaitForObjectBySelector(selector.pkg(getLauncherPackageName()), timeout);
}
@NonNull
@@ -18,16 +18,7 @@ package com.android.launcher3.tapl;
import androidx.test.uiautomator.UiObject2;
/**
* Widget in workspace or a widget list.
*/
public final class Widget extends Launchable {
Widget(LauncherInstrumentation launcher, UiObject2 icon) {
super(launcher, icon);
}
@Override
protected String getLongPressIndicator() {
return "drop_target_bar";
public class Widget {
Widget(LauncherInstrumentation launcher, UiObject2 widget) {
}
}
@@ -16,12 +16,6 @@
package com.android.launcher3.tapl;
import static org.junit.Assert.fail;
import android.graphics.Point;
import androidx.test.uiautomator.By;
import androidx.test.uiautomator.BySelector;
import androidx.test.uiautomator.Direction;
import androidx.test.uiautomator.UiObject2;
@@ -81,28 +75,4 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
protected LauncherInstrumentation.ContainerType getContainerType() {
return LauncherInstrumentation.ContainerType.WIDGETS;
}
public Widget getWidget(String label) {
final int margin = ResourceUtils.getNavbarSize(
ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, mLauncher.getResources()) + 1;
final UiObject2 widgetsContainer = verifyActiveContainer();
widgetsContainer.setGestureMargins(0, 0, 0, margin);
final Point displaySize = mLauncher.getRealDisplaySize();
int i = 0;
final BySelector selector = By.
clazz("com.android.launcher3.widget.WidgetCell").
hasDescendant(By.text(label));
for (; ; ) {
final UiObject2 widget = mLauncher.tryWaitForLauncherObject(selector, 300);
if (widget != null && widget.getVisibleBounds().intersects(
0, 0, displaySize.x, displaySize.y - margin)) {
return new Widget(mLauncher, widget);
}
if (++i > 40) fail("Too many attempts");
widgetsContainer.scroll(Direction.DOWN, 1f);
}
}
}