From 1059c30f3a049ee2fcbd6f3c2bda2a01bfa66e68 Mon Sep 17 00:00:00 2001 From: Stevie Kideckel Date: Thu, 10 Jun 2021 15:29:46 +0000 Subject: [PATCH] Account for header margin depending on which header is selected This removes jitter from incorrectly counting or not the margins for the headers near the top of the widget picker list. Bug: 189956230 Test: verified locally Change-Id: I3eeddbf8a1fb7cca31fe2a12c28b0eb444de631b --- .../widget/picker/WidgetsListAdapter.java | 6 ++++++ .../widget/picker/WidgetsRecyclerView.java | 15 +++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java index 150bd9902f..e89aea7507 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java +++ b/src/com/android/launcher3/widget/picker/WidgetsListAdapter.java @@ -298,6 +298,12 @@ public class WidgetsListAdapter extends Adapter implements OnHeaderC scrollToPositionAndMaintainOffset(positionForPackageUserKey, topForPackageUserKey); } + /** Returns the position of the currently expanded header, or empty if it's not present. */ + public OptionalInt getSelectedHeaderPosition() { + if (mWidgetsContentVisiblePackageUserKey == null) return OptionalInt.empty(); + return getPositionForPackageUserKey(mWidgetsContentVisiblePackageUserKey); + } + /** * Returns the position of {@code key} in {@link #mVisibleEntries}, or empty if it's not * present. diff --git a/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java b/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java index 090362ba33..4f4f1a3566 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java +++ b/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java @@ -53,6 +53,7 @@ public class WidgetsRecyclerView extends BaseRecyclerView implements OnItemTouch private HeaderViewDimensionsProvider mHeaderViewDimensionsProvider; private int mLastVisibleWidgetContentTableHeight = 0; private int mWidgetHeaderHeight = 0; + private final int mCollapsedHeaderBottomMarginSize; @Nullable private OnContentChangeListener mOnContentChangeListener; public WidgetsRecyclerView(Context context) { @@ -71,6 +72,10 @@ public class WidgetsRecyclerView extends BaseRecyclerView implements OnItemTouch ActivityContext activity = ActivityContext.lookupContext(getContext()); DeviceProfile grid = activity.getDeviceProfile(); + + // The bottom margin used when the header is not expanded. + mCollapsedHeaderBottomMarginSize = + getResources().getDimensionPixelSize(R.dimen.widget_list_entry_bottom_margin); } @Override @@ -182,10 +187,7 @@ public class WidgetsRecyclerView extends BaseRecyclerView implements OnItemTouch && mLastVisibleWidgetContentTableHeight == 0 && view.getMeasuredHeight() > 0) { // This assumes all header views are of the same height. - RecyclerView.LayoutParams layoutParams = - (RecyclerView.LayoutParams) view.getLayoutParams(); - mWidgetHeaderHeight = view.getMeasuredHeight() + layoutParams.topMargin - + layoutParams.bottomMargin; + mWidgetHeaderHeight = view.getMeasuredHeight(); } } @@ -279,12 +281,17 @@ public class WidgetsRecyclerView extends BaseRecyclerView implements OnItemTouch if (untilIndex > mAdapter.getItems().size()) { untilIndex = mAdapter.getItems().size(); } + int expandedHeaderPosition = mAdapter.getSelectedHeaderPosition().orElse(-1); int totalItemsHeight = 0; for (int i = 0; i < untilIndex; i++) { WidgetsListBaseEntry entry = mAdapter.getItems().get(i); if (entry instanceof WidgetsListHeaderEntry || entry instanceof WidgetsListSearchHeaderEntry) { totalItemsHeight += mWidgetHeaderHeight; + if (expandedHeaderPosition != i) { + // If the header is collapsed, include the bottom margin it will use. + totalItemsHeight += mCollapsedHeaderBottomMarginSize; + } } else if (entry instanceof WidgetsListContentEntry) { totalItemsHeight += mLastVisibleWidgetContentTableHeight; } else {