Fix scrolling in widgets picker tapl tests

If the search bar and the target widget item intersect, scroll up to
make the target widget item clickable.

Test: run AddWidgetTest, AddConfigWidgetTest

Bug: 183403949
Change-Id: I847cc34757cb02b1a12e18e511fda749873ad5da
This commit is contained in:
Steven Ng
2021-03-23 15:30:31 +00:00
parent f3814eea2d
commit 6c5e02ac27
@@ -18,7 +18,6 @@ package com.android.launcher3.tapl;
import static com.android.launcher3.tapl.LauncherInstrumentation.WAIT_TIME_MS;
import android.graphics.Point;
import android.graphics.Rect;
import androidx.test.uiautomator.By;
@@ -30,6 +29,7 @@ import androidx.test.uiautomator.Until;
import com.android.launcher3.testing.TestProtocol;
import java.util.Collection;
import java.util.List;
/**
* All widgets container.
@@ -100,17 +100,18 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck();
LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
"getting widget " + labelText + " in widgets list")) {
final UiObject2 searchBar = findSearchBar();
final UiObject2 fullWidgetsPicker = verifyActiveContainer();
mLauncher.assertTrue("Widgets container didn't become scrollable",
fullWidgetsPicker.wait(Until.scrollable(true), WAIT_TIME_MS));
final Point displaySize = mLauncher.getRealDisplaySize();
Rect headerRect = new Rect();
final UiObject2 widgetsContainer = findTestAppWidgetsTableContainer(headerRect);
final UiObject2 widgetsContainer = findTestAppWidgetsTableContainer(searchBar);
mLauncher.assertTrue("Can't locate widgets list for the test app: "
+ mLauncher.getLauncherPackageName(),
widgetsContainer != null);
final BySelector labelSelector = By.clazz("android.widget.TextView").text(labelText);
final BySelector previewSelector = By.res(mLauncher.getLauncherPackageName(),
"widget_preview");
int i = 0;
for (; ; ) {
final Collection<UiObject2> tableRows = widgetsContainer.getChildren();
@@ -125,19 +126,28 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
"View is not WidgetCell",
"com.android.launcher3.widget.WidgetCell",
widget.getClassName());
return new Widget(mLauncher, widget);
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);
return new Widget(mLauncher, preview);
}
}
mLauncher.assertTrue("Too many attempts", ++i <= 40);
final int scroll = getWidgetsScroll();
mLauncher.scroll(
fullWidgetsPicker,
Direction.DOWN,
headerRect,
10,
true);
mLauncher.scrollToLastVisibleRow(fullWidgetsPicker, tableRows, 0);
final int newScroll = getWidgetsScroll();
mLauncher.assertTrue(
"Scrolled in a wrong direction in Widgets: from " + scroll + " to "
@@ -147,8 +157,21 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
}
}
private UiObject2 findSearchBar() {
final BySelector searchBarContainerSelector = By.res(mLauncher.getLauncherPackageName(),
"search_and_recommendations_container");
final BySelector searchBarSelector = By.res(mLauncher.getLauncherPackageName(),
"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);
return searchBar;
}
/** Finds the widgets list of this test app from the collapsed full widgets picker. */
private UiObject2 findTestAppWidgetsTableContainer(Rect outHeaderRect) {
private UiObject2 findTestAppWidgetsTableContainer(final UiObject2 searchBar) {
final BySelector headerSelector = By.res(mLauncher.getLauncherPackageName(),
"widgets_list_header");
final BySelector targetAppSelector = By.clazz("android.widget.TextView").text(
@@ -161,12 +184,23 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
UiObject2 fullWidgetsPicker = verifyActiveContainer();
UiObject2 header = fullWidgetsPicker.findObject(headerSelector);
outHeaderRect.set(0, 0, 0, header.getVisibleBounds().height());
mLauncher.assertTrue("Can't find a widget header", header != null);
// Look for a header that has the test app name.
UiObject2 headerTitle = fullWidgetsPicker.findObject(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) {
@@ -185,14 +219,11 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
if (widgetsContainer != null) {
return widgetsContainer;
}
mLauncher.scrollToLastVisibleRow(fullWidgetsPicker, List.of(headerTitle), 0);
} else {
mLauncher.scrollToLastVisibleRow(fullWidgetsPicker, fullWidgetsPicker.getChildren(),
0);
}
mLauncher.scroll(
fullWidgetsPicker,
Direction.DOWN,
outHeaderRect,
/* steps= */ 10,
/* slowDown= */ true);
}
return null;