package com.android.launcher3; import android.content.Intent; import android.graphics.Point; import android.os.SystemClock; import android.support.test.uiautomator.By; import android.support.test.uiautomator.Direction; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.LargeTest; import android.view.MotionEvent; import android.view.ViewConfiguration; import java.util.List; /** * Add an arbitrary widget from the widget picker very quickly to test potential race conditions. */ @LargeTest public class QuickAddWidgetTest extends InstrumentationTestCase { // Disabled because it's flaky and not particularly useful. But this class could still be useful // as an example if we want other UI tests in the future. private static final boolean DISABLED = true; private UiDevice mDevice; private String mTargetPackage; @Override protected void setUp() throws Exception { super.setUp(); mDevice = UiDevice.getInstance(getInstrumentation()); // Set Launcher3 as home. mTargetPackage = getInstrumentation().getTargetContext().getPackageName(); Intent homeIntent = new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME) .setPackage(mTargetPackage) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getInstrumentation().getContext().startActivity(homeIntent); mDevice.wait(Until.hasObject(By.pkg(mTargetPackage).depth(0)), 3000); } public void testAddWidgetQuickly() throws Exception { if (DISABLED) return; mDevice.pressMenu(); // Enter overview mode. mDevice.wait(Until.findObject(By.text("Widgets")), 3000).click(); UiObject2 calendarWidget = getWidgetByName("Clock"); Point center = calendarWidget.getVisibleCenter(); // Touch widget just long enough to pick it up (longPressTimeout), then let go immediately. getInstrumentation().sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, center.x, center.y, 0)); Thread.sleep(ViewConfiguration.getLongPressTimeout() + 50); getInstrumentation().sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, center.x, center.y, 0)); assertTrue("Drag was never started", isOnHomescreen()); } private UiObject2 getWidgetByName(String name) { UiObject2 widgetsList = mDevice.wait(Until.findObject(By.res(mTargetPackage, "widgets_list_view")), 3000); do { UiObject2 widget = getVisibleWidgetByName(name); if (widget != null) { return widget; } } while (widgetsList.scroll(Direction.DOWN, 1f)); return getVisibleWidgetByName(name); } private UiObject2 getVisibleWidgetByName(String name) { List visibleWidgets = mDevice.wait(Until.findObjects(By.clazz( "android.widget.LinearLayout")), 3000); for (UiObject2 widget : visibleWidgets) { if (widget.hasObject(By.text(name))) { return widget; } } return null; } private boolean isOnHomescreen() { return mDevice.wait(Until.hasObject(By.res(mTargetPackage, "hotseat")), 3000); } }