Fix two pane widget picker bugs
Here we:
-Move no widgets text outside of the right pane so that we can center it
-setInset and change the clipping of children in the views so that we can fix the padding at the bottom when we have 3 button nav
-create selectedHeader where we keep track of the currently selected header in order to refresh the widgets for the selected header on rotation
-when widgets are bound we check if there are no recommended widgets, and if there aren't we select the first visible header
Fix: 324002996
Fix: 324001940
Fix: 323417968
Fix: 323460545
Fix: 323409306
Test: WidgetPickerImageTest
Flag: NONE
Change-Id: Ibd85cb086bb6c2aede6cf79da0c688a1fdaec4e5
diff --git a/res/layout/widgets_full_sheet.xml b/res/layout/widgets_full_sheet.xml
index 47bf9e7..009359c 100644
--- a/res/layout/widgets_full_sheet.xml
+++ b/res/layout/widgets_full_sheet.xml
@@ -45,7 +45,7 @@
android:visibility="gone"
android:textSize="18sp"
android:layout_below="@id/search_and_recommendations_container"
- tools:text="No widgets available" />
+ tools:text="@string/no_widgets_available" />
<!-- Fast scroller popup -->
<TextView
diff --git a/res/layout/widgets_two_pane_sheet.xml b/res/layout/widgets_two_pane_sheet.xml
index 01c1b10..cd7f2e1 100644
--- a/res/layout/widgets_two_pane_sheet.xml
+++ b/res/layout/widgets_two_pane_sheet.xml
@@ -47,6 +47,16 @@
android:textColor="?attr/widgetPickerTitleColor"
android:textSize="24sp" />
+ <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="@string/no_widgets_available" />
+
<LinearLayout
android:id="@+id/linear_layout_container"
android:layout_width="match_parent"
@@ -57,6 +67,9 @@
android:id="@+id/recycler_view_container"
android:layout_width="0dp"
android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:paddingBottom="24dp"
android:layout_gravity="start"
android:layout_weight="0.33">
<TextView
@@ -90,15 +103,6 @@
android:gravity="end"
android:layout_gravity="end"
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:id="@+id/right_pane_scroll_view"
android:layout_width="match_parent"
diff --git a/res/layout/widgets_two_pane_sheet_paged_view.xml b/res/layout/widgets_two_pane_sheet_paged_view.xml
index 4a7749b..887efb8 100644
--- a/res/layout/widgets_two_pane_sheet_paged_view.xml
+++ b/res/layout/widgets_two_pane_sheet_paged_view.xml
@@ -22,6 +22,8 @@
android:gravity="start"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin_two_pane"
android:layout_gravity="start"
+ android:clipChildren="false"
+ android:clipToPadding="false"
android:layout_alignParentStart="true">
<com.android.launcher3.widget.picker.WidgetPagedView
android:id="@+id/widgets_view_pager"
diff --git a/res/layout/widgets_two_pane_sheet_recyclerview.xml b/res/layout/widgets_two_pane_sheet_recyclerview.xml
index 8b48abb..f3d3b16 100644
--- a/res/layout/widgets_two_pane_sheet_recyclerview.xml
+++ b/res/layout/widgets_two_pane_sheet_recyclerview.xml
@@ -21,6 +21,7 @@
android:layout_height="match_parent"
android:gravity="start"
android:layout_gravity="start"
+ android:clipChildren="false"
android:layout_alignParentStart="true">
<com.android.launcher3.widget.picker.WidgetsRecyclerView
diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
index 17d9276..28bae59 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
@@ -173,6 +173,7 @@
protected WidgetsSearchBar mSearchBar;
protected TextView mHeaderTitle;
protected RecyclerViewFastScroller mFastScroller;
+ protected int mBottomPadding;
public WidgetsFullSheet(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
@@ -370,15 +371,16 @@
@Override
public void setInsets(Rect insets) {
super.setInsets(insets);
- int bottomPadding = Math.max(insets.bottom, mNavBarScrimHeight);
- setBottomPadding(mAdapters.get(AdapterHolder.PRIMARY).mWidgetsRecyclerView, bottomPadding);
- setBottomPadding(mAdapters.get(AdapterHolder.SEARCH).mWidgetsRecyclerView, bottomPadding);
+ mBottomPadding = Math.max(insets.bottom, mNavBarScrimHeight);
+ setBottomPadding(mAdapters.get(AdapterHolder.PRIMARY).mWidgetsRecyclerView, mBottomPadding);
+ setBottomPadding(mAdapters.get(AdapterHolder.SEARCH).mWidgetsRecyclerView, mBottomPadding);
if (mHasWorkProfile) {
- setBottomPadding(mAdapters.get(AdapterHolder.WORK).mWidgetsRecyclerView, bottomPadding);
+ setBottomPadding(mAdapters.get(AdapterHolder.WORK)
+ .mWidgetsRecyclerView, mBottomPadding);
}
- ((MarginLayoutParams) mNoWidgetsView.getLayoutParams()).bottomMargin = bottomPadding;
+ ((MarginLayoutParams) mNoWidgetsView.getLayoutParams()).bottomMargin = mBottomPadding;
- if (bottomPadding > 0) {
+ if (mBottomPadding > 0) {
setupNavBarColor();
} else {
clearNavBarColor();
@@ -387,6 +389,15 @@
requestLayout();
}
+ @Override
+ public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+ WindowInsets w = super.onApplyWindowInsets(insets);
+ if (mInsets.bottom != mNavBarScrimHeight) {
+ setInsets(mInsets);
+ }
+ return w;
+ }
+
private void setBottomPadding(RecyclerView recyclerView, int bottomPadding) {
recyclerView.setPadding(
recyclerView.getPaddingLeft(),
@@ -791,8 +802,9 @@
if (mDeviceProfile.isLandscape != dp.isLandscape && dp.isTablet && !dp.isTwoPanels) {
handleClose(false);
show(BaseActivity.fromContext(getContext()), false);
- } else {
+ } else if (!isTwoPane()) {
reset();
+ resetExpandedHeaders();
}
// When folding/unfolding the foldables, we need to switch between the regular widget picker
diff --git a/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java b/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java
index 26c04f5..5a1ec87 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsTwoPaneSheet.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Outline;
+import android.graphics.Rect;
import android.os.Process;
import android.util.AttributeSet;
import android.view.LayoutInflater;
@@ -58,11 +59,13 @@
private FrameLayout mSuggestedWidgetsContainer;
private WidgetsListHeader mSuggestedWidgetsHeader;
+ private PackageUserKey mSuggestedWidgetsPackageUserKey;
private LinearLayout mRightPane;
private ScrollView mRightPaneScrollView;
private WidgetsListTableViewHolderBinder mWidgetsListTableViewHolderBinder;
private int mActivePage = -1;
+ private PackageUserKey mSelectedHeader;
private final ViewOutlineProvider mViewOutlineProviderRightPane = new ViewOutlineProvider() {
@Override
@@ -124,6 +127,7 @@
mFastScroller.setVisibility(GONE);
}
+ /** Overrides onConfigurationChanged method from WidgetsFullSheet. Needed for b/319150904 */
@Override
protected void onConfigurationChanged(Configuration newConfig) {}
@@ -147,6 +151,23 @@
}
layoutParams.weight = layoutParams.width == 0 ? 0.33F : 0;
leftPane.setLayoutParams(layoutParams);
+ requestApplyInsets();
+ if (mSelectedHeader != null) {
+ if (mSelectedHeader.equals(mSuggestedWidgetsPackageUserKey)) {
+ mSuggestedWidgetsHeader.callOnClick();
+ } else {
+ getHeaderChangeListener().onHeaderChanged(mSelectedHeader);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onWidgetsBound() {
+ super.onWidgetsBound();
+ if (!mHasRecommendedWidgets && mSelectedHeader == null) {
+ mAdapters.get(mActivePage).mWidgetsListAdapter.selectFirstHeaderEntry();
+ mAdapters.get(mActivePage).mWidgetsRecyclerView.scrollToTop();
}
}
@@ -195,6 +216,8 @@
mRightPane.removeAllViews();
mRightPane.addView(mRecommendedWidgetsTable);
mRightPaneScrollView.setScrollY(0);
+ mSuggestedWidgetsPackageUserKey = PackageUserKey.fromPackageItemInfo(packageItemInfo);
+ mSelectedHeader = mSuggestedWidgetsPackageUserKey;
});
mSuggestedWidgetsContainer.addView(mSuggestedWidgetsHeader);
}
@@ -273,6 +296,7 @@
return new HeaderChangeListener() {
@Override
public void onHeaderChanged(@NonNull PackageUserKey selectedHeader) {
+ mSelectedHeader = selectedHeader;
WidgetsListContentEntry contentEntry = mActivityContext.getPopupDataProvider()
.getSelectedAppWidgets(selectedHeader);
@@ -303,6 +327,18 @@
}
@Override
+ public void setInsets(Rect insets) {
+ super.setInsets(insets);
+ FrameLayout rightPaneContainer = mContent.findViewById(R.id.right_pane_container);
+ rightPaneContainer.setPadding(
+ rightPaneContainer.getPaddingLeft(),
+ rightPaneContainer.getPaddingTop(),
+ rightPaneContainer.getPaddingRight(),
+ mBottomPadding);
+ requestLayout();
+ }
+
+ @Override
protected int getWidgetListHorizontalMargin() {
return getResources().getDimensionPixelSize(
R.dimen.widget_list_left_pane_horizontal_margin);