diff options
Diffstat (limited to 'tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java')
-rw-r--r-- | tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java | 85 |
1 files changed, 63 insertions, 22 deletions
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 15615fc6b..c52650da4 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -37,7 +37,6 @@ import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Parcelable; import android.os.SystemClock; @@ -52,6 +51,7 @@ import android.view.accessibility.AccessibilityEvent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.test.InstrumentationRegistry; import androidx.test.uiautomator.By; import androidx.test.uiautomator.BySelector; import androidx.test.uiautomator.Configurator; @@ -60,6 +60,7 @@ import androidx.test.uiautomator.UiDevice; import androidx.test.uiautomator.UiObject2; import androidx.test.uiautomator.Until; +import com.android.launcher3.ResourceUtils; import com.android.launcher3.testing.TestProtocol; import com.android.systemui.shared.system.QuickStepContract; @@ -68,12 +69,14 @@ import org.junit.Assert; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.ref.WeakReference; +import java.util.Collection; +import java.util.Collections; import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; -import java.util.function.Supplier; +import java.util.function.Function; /** * The main tapl object. The only object that can be explicitly constructed by the using code. It @@ -84,6 +87,7 @@ public final class LauncherInstrumentation { private static final String TAG = "Tapl"; private static final int ZERO_BUTTON_STEPS_FROM_BACKGROUND_TO_HOME = 20; private static final int GESTURE_STEP_MS = 16; + private static long START_TIME = System.currentTimeMillis(); // Types for launcher containers that the user is interacting with. "Background" is a // pseudo-container corresponding to inactive launcher covered by another app. @@ -134,13 +138,22 @@ public final class LauncherInstrumentation { private int mExpectedRotation = Surface.ROTATION_0; private final Uri mTestProviderUri; private final Deque<String> mDiagnosticContext = new LinkedList<>(); - private Supplier<String> mSystemHealthSupplier; + private Function<Long, String> mSystemHealthSupplier; private Consumer<ContainerType> mOnSettledStateAction; /** * Constructs the root of TAPL hierarchy. You get all other objects from it. */ + public LauncherInstrumentation() { + this(InstrumentationRegistry.getInstrumentation()); + } + + /** + * Constructs the root of TAPL hierarchy. You get all other objects from it. + * Deprecated: use the constructor without parameters instead. + */ + @Deprecated public LauncherInstrumentation(Instrumentation instrumentation) { mInstrumentation = instrumentation; mDevice = UiDevice.getInstance(instrumentation); @@ -238,10 +251,6 @@ public final class LauncherInstrumentation { return null; } - public static boolean isAvd() { - return Build.MODEL.contains("Cuttlefish"); - } - static void log(String message) { Log.d(TAG, message); } @@ -296,7 +305,7 @@ public final class LauncherInstrumentation { return "Background"; } - public void setSystemHealthSupplier(Supplier<String> supplier) { + public void setSystemHealthSupplier(Function<Long, String> supplier) { this.mSystemHealthSupplier = supplier; } @@ -316,8 +325,8 @@ public final class LauncherInstrumentation { } return mSystemHealthSupplier != null - ? mSystemHealthSupplier.get() - : TestHelpers.getSystemHealthMessage(getContext()); + ? mSystemHealthSupplier.apply(START_TIME) + : TestHelpers.getSystemHealthMessage(getContext(), START_TIME); } private void fail(String message) { @@ -534,6 +543,9 @@ public final class LauncherInstrumentation { // accessibility events prior to pressing Home. final String action; if (getNavigationModel() == NavigationModel.ZERO_BUTTON) { + final String anomaly = getAnomalyMessage(); + if (anomaly != null) fail("Can't swipe up to Home: " + anomaly); + final Point displaySize = getRealDisplaySize(); if (hasLauncherObject("deep_shortcuts_container")) { @@ -541,13 +553,17 @@ public final class LauncherInstrumentation { displaySize.x / 2, displaySize.y - 1, displaySize.x / 2, 0, ZERO_BUTTON_STEPS_FROM_BACKGROUND_TO_HOME); - assertTrue("Context menu is still visible afterswiping up to home", - !hasLauncherObject("deep_shortcuts_container")); + try (LauncherInstrumentation.Closable c = addContextLayer( + "Swiped up from context menu to home")) { + waitUntilGone("deep_shortcuts_container"); + } } if (hasLauncherObject(WORKSPACE_RES_ID)) { log(action = "already at home"); } else { - log(action = "swiping up to home"); + log("Hierarchy before swiping up to home"); + dumpViewHierarchy(); + log(action = "swiping up to home from " + getVisibleStateMessage()); final int finalState = mDevice.hasObject(By.pkg(getLauncherPackageName())) ? NORMAL_STATE_ORDINAL : BACKGROUND_APP_STATE_ORDINAL; @@ -769,7 +785,36 @@ public final class LauncherInstrumentation { TestProtocol.stateOrdinalToString(parcel.getInt(TestProtocol.STATE_FIELD))); } - void scroll(UiObject2 container, Direction direction, float percent, Rect margins, int steps) { + int getBottomGestureSize() { + return ResourceUtils.getNavbarSize( + ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, getResources()) + 1; + } + + int getBottomGestureMargin(UiObject2 container) { + return container.getVisibleBounds().bottom - getRealDisplaySize().y + + getBottomGestureSize(); + } + + void scrollToLastVisibleRow(UiObject2 container, Collection<UiObject2> items, int topPadding) { + final UiObject2 lowestItem = Collections.max(items, (i1, i2) -> + Integer.compare(i1.getVisibleBounds().top, i2.getVisibleBounds().top)); + + final int gestureStart = lowestItem.getVisibleBounds().top + getTouchSlop(); + final int distance = gestureStart - container.getVisibleBounds().top - topPadding; + final int bottomMargin = container.getVisibleBounds().height() - distance; + + scroll( + container, + Direction.DOWN, + new Rect( + 0, + 0, + 0, + Math.max(bottomMargin, getBottomGestureMargin(container))), + 150); + } + + void scroll(UiObject2 container, Direction direction, Rect margins, int steps) { final Rect rect = container.getVisibleBounds(); if (margins != null) { rect.left += margins.left; @@ -787,7 +832,7 @@ public final class LauncherInstrumentation { case UP: { startX = endX = rect.centerX(); final int vertCenter = rect.centerY(); - final float halfGestureHeight = rect.height() * percent / 2.0f; + final float halfGestureHeight = rect.height() / 2.0f; startY = (int) (vertCenter - halfGestureHeight) + 1; endY = (int) (vertCenter + halfGestureHeight); } @@ -795,7 +840,7 @@ public final class LauncherInstrumentation { case DOWN: { startX = endX = rect.centerX(); final int vertCenter = rect.centerY(); - final float halfGestureHeight = rect.height() * percent / 2.0f; + final float halfGestureHeight = rect.height() / 2.0f; startY = (int) (vertCenter + halfGestureHeight) - 1; endY = (int) (vertCenter - halfGestureHeight); } @@ -803,7 +848,7 @@ public final class LauncherInstrumentation { case LEFT: { startY = endY = rect.centerY(); final int horizCenter = rect.centerX(); - final float halfGestureWidth = rect.width() * percent / 2.0f; + final float halfGestureWidth = rect.width() / 2.0f; startX = (int) (horizCenter - halfGestureWidth) + 1; endX = (int) (horizCenter + halfGestureWidth); } @@ -811,7 +856,7 @@ public final class LauncherInstrumentation { case RIGHT: { startY = endY = rect.centerY(); final int horizCenter = rect.centerX(); - final float halfGestureWidth = rect.width() * percent / 2.0f; + final float halfGestureWidth = rect.width() / 2.0f; startX = (int) (horizCenter + halfGestureWidth) - 1; endX = (int) (horizCenter - halfGestureWidth); } @@ -844,10 +889,6 @@ public final class LauncherInstrumentation { mDevice.waitForIdle(); } - float getDisplayDensity() { - return mInstrumentation.getTargetContext().getResources().getDisplayMetrics().density; - } - int getTouchSlop() { return ViewConfiguration.get(getContext()).getScaledTouchSlop(); } |