summaryrefslogtreecommitdiffstats
path: root/tests/src/com/android/launcher3/ui/TestViewHelpers.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/com/android/launcher3/ui/TestViewHelpers.java')
-rw-r--r--tests/src/com/android/launcher3/ui/TestViewHelpers.java114
1 files changed, 114 insertions, 0 deletions
diff --git a/tests/src/com/android/launcher3/ui/TestViewHelpers.java b/tests/src/com/android/launcher3/ui/TestViewHelpers.java
index d0df66485..d13d31952 100644
--- a/tests/src/com/android/launcher3/ui/TestViewHelpers.java
+++ b/tests/src/com/android/launcher3/ui/TestViewHelpers.java
@@ -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);