diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index 7bfe33c9ba..475a4ff374 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -52,6 +52,7 @@ import android.view.WindowManager; 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; @@ -867,6 +868,16 @@ public final class LauncherInstrumentation { return object; } + @Nullable + UiObject2 findObjectInContainer(UiObject2 container, BySelector selector) { + try { + return container.findObject(selector); + } catch (StaleObjectException e) { + fail("The container disappeared from screen"); + return null; + } + } + @NonNull List getObjectsInContainer(UiObject2 container, String resName) { try { @@ -1059,6 +1070,11 @@ public final class LauncherInstrumentation { final int itemRowNewTopOnScreen = containerRect.top + topPaddingInContainer; final int distance = itemRowCurrentTopOnScreen - itemRowNewTopOnScreen + getTouchSlop(); + scrollDownByDistance(container, distance); + } + + void scrollDownByDistance(UiObject2 container, int distance) { + final Rect containerRect = getVisibleBounds(container); final int bottomGestureMarginInContainer = getBottomGestureMarginInContainer(container); scroll( container, diff --git a/tests/tapl/com/android/launcher3/tapl/Widgets.java b/tests/tapl/com/android/launcher3/tapl/Widgets.java index f08491342b..a3f9ade054 100644 --- a/tests/tapl/com/android/launcher3/tapl/Widgets.java +++ b/tests/tapl/com/android/launcher3/tapl/Widgets.java @@ -17,6 +17,7 @@ package com.android.launcher3.tapl; import static com.android.launcher3.tapl.LauncherInstrumentation.WAIT_TIME_MS; +import static com.android.launcher3.tapl.LauncherInstrumentation.log; import android.graphics.Rect; @@ -29,13 +30,13 @@ import androidx.test.uiautomator.Until; import com.android.launcher3.testing.TestProtocol; import java.util.Collection; -import java.util.List; /** * All widgets container. */ public final class Widgets extends LauncherInstrumentation.VisibleContainer { private static final int FLING_STEPS = 10; + private static final int SCROLL_ATTEMPTS = 60; Widgets(LauncherInstrumentation launcher) { super(launcher); @@ -49,7 +50,7 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); LauncherInstrumentation.Closable c = mLauncher.addContextLayer( "want to fling forward in widgets")) { - LauncherInstrumentation.log("Widgets.flingForward enter"); + log("Widgets.flingForward enter"); final UiObject2 widgetsContainer = verifyActiveContainer(); mLauncher.scroll( widgetsContainer, @@ -60,7 +61,7 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer("flung forward")) { verifyActiveContainer(); } - LauncherInstrumentation.log("Widgets.flingForward exit"); + log("Widgets.flingForward exit"); } } @@ -71,7 +72,7 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); LauncherInstrumentation.Closable c = mLauncher.addContextLayer( "want to fling backwards in widgets")) { - LauncherInstrumentation.log("Widgets.flingBackward enter"); + log("Widgets.flingBackward enter"); final UiObject2 widgetsContainer = verifyActiveContainer(); mLauncher.scroll( widgetsContainer, @@ -81,7 +82,7 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer("flung back")) { verifyActiveContainer(); } - LauncherInstrumentation.log("Widgets.flingBackward exit"); + log("Widgets.flingBackward exit"); } } @@ -101,11 +102,12 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { LauncherInstrumentation.Closable c = mLauncher.addContextLayer( "getting widget " + labelText + " in widgets list")) { final UiObject2 searchBar = findSearchBar(); + final int searchBarHeight = searchBar.getVisibleBounds().height(); final UiObject2 fullWidgetsPicker = verifyActiveContainer(); mLauncher.assertTrue("Widgets container didn't become scrollable", fullWidgetsPicker.wait(Until.scrollable(true), WAIT_TIME_MS)); - final UiObject2 widgetsContainer = findTestAppWidgetsTableContainer(searchBar); + final UiObject2 widgetsContainer = findTestAppWidgetsTableContainer(); mLauncher.assertTrue("Can't locate widgets list for the test app: " + mLauncher.getLauncherPackageName(), widgetsContainer != null); @@ -118,7 +120,8 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { for (UiObject2 row : tableRows) { final Collection widgetCells = row.getChildren(); for (UiObject2 widget : widgetCells) { - final UiObject2 label = widget.findObject(labelSelector); + final UiObject2 label = mLauncher.findObjectInContainer(widget, + labelSelector); if (label == null) { continue; } @@ -126,28 +129,15 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { "View is not WidgetCell", "com.android.launcher3.widget.WidgetCell", widget.getClassName()); - UiObject2 preview = widget.findObject(previewSelector); - mLauncher.assertTrue("Can't find widget preview", preview != null); - Rect previewRect = new Rect(preview.getVisibleBounds()); - boolean intersected = searchBar.getVisibleBounds().intersect(previewRect); - if (intersected) { - Rect scrollUp = new Rect(/* left= */ 0, /* top= */0, /* right*/ 0, - /* bottom= */ searchBar.getVisibleBounds().height()); - mLauncher.scroll( - fullWidgetsPicker, - Direction.UP, - scrollUp, - /* steps= */ 2, - /* slowDown= */ true); - } - preview = widget.findObject(previewSelector); + UiObject2 preview = mLauncher.waitForObjectInContainer(widget, + previewSelector); return new Widget(mLauncher, preview); } } - mLauncher.assertTrue("Too many attempts", ++i <= 40); + mLauncher.assertTrue("Too many attempts", ++i <= SCROLL_ATTEMPTS); final int scroll = getWidgetsScroll(); - mLauncher.scrollToLastVisibleRow(fullWidgetsPicker, tableRows, 0); + mLauncher.scrollDownByDistance(fullWidgetsPicker, searchBarHeight); final int newScroll = getWidgetsScroll(); mLauncher.assertTrue( "Scrolled in a wrong direction in Widgets: from " + scroll + " to " @@ -164,14 +154,13 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { "widgets_search_bar"); final UiObject2 searchBarContainer = mLauncher.waitForLauncherObject( searchBarContainerSelector); - mLauncher.assertTrue("Can't find a search bar container", searchBarContainer != null); - UiObject2 searchBar = searchBarContainer.findObject(searchBarSelector); - mLauncher.assertTrue("Can't find a search bar", searchBar != null); + UiObject2 searchBar = mLauncher.waitForObjectInContainer(searchBarContainer, + searchBarSelector); return searchBar; } /** Finds the widgets list of this test app from the collapsed full widgets picker. */ - private UiObject2 findTestAppWidgetsTableContainer(final UiObject2 searchBar) { + private UiObject2 findTestAppWidgetsTableContainer() { final BySelector headerSelector = By.res(mLauncher.getLauncherPackageName(), "widgets_list_header"); final BySelector targetAppSelector = By.clazz("android.widget.TextView").text( @@ -180,50 +169,34 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { "widgets_table"); boolean hasHeaderExpanded = false; - for (int i = 0; i < 40; i++) { + for (int i = 0; i < SCROLL_ATTEMPTS; i++) { UiObject2 fullWidgetsPicker = verifyActiveContainer(); - UiObject2 header = fullWidgetsPicker.findObject(headerSelector); - mLauncher.assertTrue("Can't find a widget header", header != null); + UiObject2 header = mLauncher.waitForObjectInContainer(fullWidgetsPicker, + headerSelector); + int headerHeight = header.getVisibleBounds().height(); // Look for a header that has the test app name. - UiObject2 headerTitle = fullWidgetsPicker.findObject(targetAppSelector); + UiObject2 headerTitle = mLauncher.findObjectInContainer(fullWidgetsPicker, + targetAppSelector); if (headerTitle != null) { - Rect headerTitleRect = new Rect(headerTitle.getVisibleBounds()); - boolean intersected = searchBar.getVisibleBounds().intersect(headerTitleRect); - if (intersected) { - Rect scrollUp = new Rect(/* left= */ 0, /* top= */0, /* right*/ 0, - /* bottom= */ searchBar.getVisibleBounds().height()); - mLauncher.scroll( - fullWidgetsPicker, - Direction.UP, - scrollUp, - /* steps= */ 2, - /* slowDown= */ true); - } // If we find the header and it has not been expanded, let's click it to see the // widgets list. if (!hasHeaderExpanded) { + log("Header has not been expanded. Click to expand."); hasHeaderExpanded = true; mLauncher.clickLauncherObject(headerTitle); - // After clicking the header, the recyclerview has been updated. Let's refresh - // the container UIObject2. - fullWidgetsPicker = verifyActiveContainer(); - // Refresh headerTitle because the first instance is stale after - // verifyActiveContainer call. - headerTitle = fullWidgetsPicker.findObject(targetAppSelector); } // Look for a widgets list. - UiObject2 widgetsContainer = fullWidgetsPicker.findObject(widgetsContainerSelector); + UiObject2 widgetsContainer = mLauncher.findObjectInContainer(fullWidgetsPicker, + widgetsContainerSelector); if (widgetsContainer != null) { + log("Widgets container found."); return widgetsContainer; } - mLauncher.scrollToLastVisibleRow(fullWidgetsPicker, List.of(headerTitle), 0); - } else { - mLauncher.scrollToLastVisibleRow(fullWidgetsPicker, fullWidgetsPicker.getChildren(), - 0); } + mLauncher.scrollDownByDistance(fullWidgetsPicker, headerHeight); } return null;