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);