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
This commit is contained in:
fbaron
2024-02-05 09:08:38 -08:00
committed by Federico Baron
parent e14948d0f6
commit 88676ba7bb
6 changed files with 72 additions and 17 deletions

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -173,6 +173,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet
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 @@ public class WidgetsFullSheet extends BaseWidgetSheet
@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 @@ public class WidgetsFullSheet extends BaseWidgetSheet
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 @@ public class WidgetsFullSheet extends BaseWidgetSheet
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

View File

@@ -20,6 +20,7 @@ import static com.android.launcher3.Flags.enableUnfoldedTwoPanePicker;
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 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet {
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 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet {
mFastScroller.setVisibility(GONE);
}
/** Overrides onConfigurationChanged method from WidgetsFullSheet. Needed for b/319150904 */
@Override
protected void onConfigurationChanged(Configuration newConfig) {}
@@ -147,6 +151,23 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet {
}
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 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet {
mRightPane.removeAllViews();
mRightPane.addView(mRecommendedWidgetsTable);
mRightPaneScrollView.setScrollY(0);
mSuggestedWidgetsPackageUserKey = PackageUserKey.fromPackageItemInfo(packageItemInfo);
mSelectedHeader = mSuggestedWidgetsPackageUserKey;
});
mSuggestedWidgetsContainer.addView(mSuggestedWidgetsHeader);
}
@@ -273,6 +296,7 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet {
return new HeaderChangeListener() {
@Override
public void onHeaderChanged(@NonNull PackageUserKey selectedHeader) {
mSelectedHeader = selectedHeader;
WidgetsListContentEntry contentEntry = mActivityContext.getPopupDataProvider()
.getSelectedAppWidgets(selectedHeader);
@@ -302,6 +326,18 @@ public class WidgetsTwoPaneSheet extends WidgetsFullSheet {
};
}
@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(