Merge changes I8ccf962f,I383c7540 into udc-dev

* changes:
  Turn on the flag for large screen widget picker
  Add test for widget picker on landscape mode for tablets
This commit is contained in:
Federico Baron
2023-03-21 22:28:18 +00:00
committed by Android (Google) Code Review
7 changed files with 134 additions and 114 deletions
+75 -78
View File
@@ -20,68 +20,89 @@
android:orientation="vertical"
android:theme="?attr/widgetsTheme">
<androidx.constraintlayout.widget.ConstraintLayout
<com.android.launcher3.views.SpringRelativeLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:importantForAccessibility="no">
<FrameLayout
android:id="@+id/recycler_view_container"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintWidth_percent="0.33">
<View
android:id="@+id/collapse_handle"
android:layout_width="@dimen/bottom_sheet_handle_width"
android:layout_height="@dimen/bottom_sheet_handle_height"
android:layout_marginTop="@dimen/bottom_sheet_handle_margin"
android:layout_centerHorizontal="true"
android:background="@drawable/bg_rounded_corner_bottom_sheet_handle"/>
<TextView
android:id="@+id/fast_scroller_popup"
style="@style/FastScrollerPopup"
android:layout_marginEnd="@dimen/fastscroll_popup_margin" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="center_horizontal"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin_large_screen"
android:text="@string/widget_button_text"
android:textColor="?android:attr/textColorSecondary"
android:textSize="24sp" />
<!-- Fast scroller popup -->
<com.android.launcher3.views.RecyclerViewFastScroller
android:id="@+id/fast_scroller"
android:layout_width="@dimen/fastscroll_width"
<LinearLayout
android:id="@+id/linear_layout_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/title">
<FrameLayout
android:id="@+id/recycler_view_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/fastscroll_end_margin" />
android:layout_gravity="start"
android:layout_weight="0.33">
<TextView
android:id="@+id/fast_scroller_popup"
style="@style/FastScrollerPopup"
android:layout_marginEnd="@dimen/fastscroll_popup_margin" />
<com.android.launcher3.widget.picker.WidgetsRecyclerView
android:id="@+id/search_widgets_list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin_large_screen"
android:visibility="gone" />
</FrameLayout>
<!-- Fast scroller popup -->
<com.android.launcher3.views.RecyclerViewFastScroller
android:id="@+id/fast_scroller"
android:layout_width="@dimen/fastscroll_width"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/fastscroll_end_margin" />
<FrameLayout
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/recycler_view_container"
app:layout_constraintTop_toBottomOf="@id/title"
android:paddingEnd="16dp"
android:paddingStart="8dp"
android:layout_marginTop="26dp"
app:layout_constraintWidth_percent="0.67"
app:layout_constraintBottom_toBottomOf="parent"
android:orientation="horizontal">
<TextView
android:id="@+id/no_widgets_text"
style="@style/PrimaryHeadline"
android:layout_width="match_parent"
<com.android.launcher3.widget.picker.WidgetsRecyclerView
android:id="@+id/search_widgets_list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin_large_screen"
android:visibility="gone" />
</FrameLayout>
<FrameLayout
android:id="@+id/right_pane_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="18sp"
android:visibility="gone"
tools:text="No widgets available" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/right_pane">
android:layout_weight="0.67"
android:paddingEnd="16dp"
android:paddingTop="24dp"
android:gravity="end"
android:layout_gravity="end"
android:paddingStart="8dp"
android:orientation="horizontal">
<TextView
android:id="@+id/no_widgets_text"
style="@style/PrimaryHeadline"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="18sp"
android:visibility="gone"
tools:text="No widgets available" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/right_pane">
<com.android.launcher3.widget.picker.WidgetsRecommendationTableLayout
android:id="@+id/recommended_widget_table"
android:background="@drawable/widgets_surface_background"
@@ -91,32 +112,8 @@
"@dimen/widget_list_horizontal_margin_large_screen"
android:paddingVertical="@dimen/recommended_widgets_table_vertical_padding"
android:visibility="gone" />
</ScrollView>
</FrameLayout>
<View
android:id="@+id/collapse_handle"
android:layout_width="@dimen/bottom_sheet_handle_width"
android:layout_height="@dimen/bottom_sheet_handle_height"
android:layout_marginTop="@dimen/bottom_sheet_handle_margin"
android:background="@drawable/bg_rounded_corner_bottom_sheet_handle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/collapse_handle"
android:layout_marginTop="24dp"
android:gravity="center_horizontal"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin_large_screen"
android:text="@string/widget_button_text"
android:textColor="?android:attr/textColorSecondary"
android:textSize="24sp" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</FrameLayout>
</LinearLayout>
</com.android.launcher3.views.SpringRelativeLayout>
</com.android.launcher3.widget.picker.WidgetsFullSheet>
@@ -18,13 +18,11 @@
<FrameLayout
android:id="@+id/widgets_full_sheet_paged_view_large_screen"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintEnd_toStartOf="@id/scrollView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintWidth_percent="0.33">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="start"
android:layout_gravity="start"
android:layout_alignParentStart="true">
<com.android.launcher3.widget.picker.WidgetPagedView
android:id="@+id/widgets_view_pager"
android:layout_width="match_parent"
@@ -18,13 +18,11 @@
<FrameLayout
android:id="@+id/widgets_full_sheet_recyclerview_large_screen"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintEnd_toStartOf="@id/scrollView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintWidth_percent="0.33">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="start"
android:layout_gravity="start"
android:layout_alignParentStart="true">
<com.android.launcher3.widget.picker.WidgetsRecyclerView
android:id="@+id/primary_widgets_list_view"
@@ -65,4 +63,4 @@
</LinearLayout>
</com.android.launcher3.views.StickyHeaderLayout>
</FrameLayout>
</merge>
</merge>
@@ -351,7 +351,7 @@ public final class FeatureFlags {
"SHOW_DOT_PAGINATION", true, "Enable showing dot pagination in workspace");
public static final BooleanFlag LARGE_SCREEN_WIDGET_PICKER = getDebugFlag(270395809,
"LARGE_SCREEN_WIDGET_PICKER", false, "Enable new widget picker that takes "
"LARGE_SCREEN_WIDGET_PICKER", true, "Enable new widget picker that takes "
+ "advantage of large screen format");
public static final BooleanFlag ENABLE_NEW_GESTURE_NAV_TUTORIAL = getDebugFlag(270396257,
@@ -204,6 +204,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet
&& mDeviceProfile.isLandscape
&& LARGE_SCREEN_WIDGET_PICKER.get();
mHasWorkProfile = context.getSystemService(LauncherApps.class).getProfiles().size() > 1;
mOrientation = Launcher.getLauncher(context).getOrientation();
mAdapters.put(AdapterHolder.PRIMARY, new AdapterHolder(AdapterHolder.PRIMARY));
mAdapters.put(AdapterHolder.WORK, new AdapterHolder(AdapterHolder.WORK));
mAdapters.put(AdapterHolder.SEARCH, new AdapterHolder(AdapterHolder.SEARCH));
@@ -232,13 +233,22 @@ public class WidgetsFullSheet extends BaseWidgetSheet
mContent.setClipToOutline(true);
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
int contentLayoutRes = mHasWorkProfile ? R.layout.widgets_full_sheet_paged_view
: R.layout.widgets_full_sheet_recyclerview;
if (mIsTwoPane) {
contentLayoutRes = mHasWorkProfile ? R.layout.widgets_full_sheet_paged_view_large_screen
: R.layout.widgets_full_sheet_recyclerview_large_screen;
layoutInflater.inflate(
mHasWorkProfile
? R.layout.widgets_full_sheet_paged_view_large_screen
: R.layout.widgets_full_sheet_recyclerview_large_screen,
findViewById(R.id.recycler_view_container),
true);
} else {
layoutInflater.inflate(
mHasWorkProfile
? R.layout.widgets_full_sheet_paged_view
: R.layout.widgets_full_sheet_recyclerview,
mContent,
true);
}
layoutInflater.inflate(contentLayoutRes, mContent, true);
mFastScroller = findViewById(R.id.fast_scroller);
if (mIsTwoPane) {
@@ -349,7 +359,8 @@ public class WidgetsFullSheet extends BaseWidgetSheet
// if the current active page changes to personal or work we set suggestions
// to be the selected widget
if (mIsTwoPane && (currentActivePage == PERSONAL_TAB || currentActivePage == WORK_TAB)) {
if (mIsTwoPane && mSuggestedWidgetsHeader != null
&& (currentActivePage == PERSONAL_TAB || currentActivePage == WORK_TAB)) {
mSuggestedWidgetsHeader.callOnClick();
}
@@ -433,7 +444,9 @@ public class WidgetsFullSheet extends BaseWidgetSheet
super.onAttachedToWindow();
mActivityContext.getAppWidgetHolder().addProviderChangeListener(this);
notifyWidgetProvidersChanged();
onRecommendedWidgetsBound();
if (!mIsTwoPane) {
onRecommendedWidgetsBound();
}
}
@Override
@@ -696,6 +709,9 @@ public class WidgetsFullSheet extends BaseWidgetSheet
recommendedWidgetsInTable, maxTableHeight);
} else {
mRecommendedWidgetsTable.setVisibility(GONE);
if (mSuggestedWidgetsContainer != null) {
mSuggestedWidgetsContainer.setVisibility(GONE);
}
}
}
@@ -60,11 +60,11 @@ public class AddWidgetTest extends AbstractLauncherUiTest {
final LauncherAppWidgetProviderInfo widgetInfo =
TestViewHelpers.findWidgetProvider(this, false /* hasConfigureScreen */);
WidgetResizeFrame resizeFrame = mLauncher.
getWorkspace().
openAllWidgets().
getWidget(widgetInfo.getLabel(mTargetContext.getPackageManager())).
dragWidgetToWorkspace();
WidgetResizeFrame resizeFrame = mLauncher
.getWorkspace()
.openAllWidgets()
.getWidget(widgetInfo.getLabel(mTargetContext.getPackageManager()))
.dragWidgetToWorkspace();
assertTrue(mActivityMonitor.itemExists(
(info, view) -> info instanceof LauncherAppWidgetInfo &&
@@ -77,8 +77,8 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
mLauncher.scroll(
widgetsContainer,
Direction.UP,
new Rect(0, 0, mLauncher.getRightGestureMarginInContainer(widgetsContainer) + 1,
0),
new Rect(0, 0, 0,
mLauncher.getBottomGestureMarginInContainer(widgetsContainer) + 1),
FLING_STEPS, false);
try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer("flung back")) {
verifyActiveContainer();
@@ -168,6 +168,8 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
private UiObject2 findTestAppWidgetsTableContainer() {
final BySelector headerSelector = By.res(mLauncher.getLauncherPackageName(),
"widgets_list_header");
final BySelector widgetPickerSelector = By.res(mLauncher.getLauncherPackageName(),
"container");
final BySelector targetAppSelector = By.clazz("android.widget.TextView").text(
mLauncher.getContext().getPackageName());
final BySelector widgetsContainerSelector = By.res(mLauncher.getLauncherPackageName(),
@@ -176,17 +178,23 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
boolean hasHeaderExpanded = false;
int scrollDistance = 0;
for (int i = 0; i < SCROLL_ATTEMPTS; i++) {
UiObject2 fullWidgetsPicker = verifyActiveContainer();
UiObject2 header = mLauncher.waitForObjectInContainer(fullWidgetsPicker,
UiObject2 widgetPicker = mLauncher.waitForLauncherObject(widgetPickerSelector);
UiObject2 widgetListView = verifyActiveContainer();
UiObject2 header = mLauncher.waitForObjectInContainer(widgetListView,
headerSelector);
// If we are in a tablet in landscape mode then we will have a two pane view and we use
// the right pane to display the widgets table.
UiObject2 rightPane = mLauncher.findObjectInContainer(
widgetPicker,
widgetsContainerSelector);
// If a header is barely visible in the bottom edge of the screen, its height could be
// too small for a scroll gesture. Since all header should have roughly the same height,
// let's pick the max height we have seen so far.
scrollDistance = Math.max(scrollDistance, header.getVisibleBounds().height());
// Look for a header that has the test app name.
UiObject2 headerTitle = mLauncher.findObjectInContainer(fullWidgetsPicker,
UiObject2 headerTitle = mLauncher.findObjectInContainer(widgetListView,
targetAppSelector);
if (headerTitle != null) {
// If we find the header and it has not been expanded, let's click it to see the
@@ -202,7 +210,8 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
}
// Look for a widgets list.
UiObject2 widgetsContainer = mLauncher.findObjectInContainer(fullWidgetsPicker,
UiObject2 widgetsContainer = mLauncher.findObjectInContainer(
rightPane != null ? rightPane : widgetListView,
widgetsContainerSelector);
if (widgetsContainer != null) {
log("Widgets container found.");
@@ -210,7 +219,9 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer {
}
}
log("Finding test widget package - scroll with distance: " + scrollDistance);
mLauncher.scrollDownByDistance(fullWidgetsPicker, scrollDistance);
mLauncher.scrollDownByDistance(hasHeaderExpanded && rightPane != null
? rightPane
: widgetListView, scrollDistance);
}
return null;