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
This commit is contained in:
Stevie Kideckel
2021-06-10 15:29:46 +00:00
parent 8f3d9eba02
commit 1059c30f3a
2 changed files with 17 additions and 4 deletions
@@ -298,6 +298,12 @@ public class WidgetsListAdapter extends Adapter<ViewHolder> 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.
@@ -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 {