Align 'No widgets available' text box properly in Widget picker.

Bug: 186209657
Test: Tested manually
Change-Id: I85fa43cd745a8c9f9601d25ed3a35f512506234d
This commit is contained in:
Alina Zaidi
2021-05-21 10:49:03 +01:00
parent 9f194ee290
commit 260c38c4a0
2 changed files with 59 additions and 8 deletions

View File

@@ -21,6 +21,7 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
@@ -39,9 +40,11 @@ final class SearchAndRecommendationsScrollController implements
private final View mSearchAndRecommendationViewParent;
private final WidgetsRecyclerView mPrimaryRecyclerView;
private final WidgetsRecyclerView mSearchRecyclerView;
private final TextView mNoWidgetsView;
private final int mTabsHeight;
private final ValueAnimator mAnimator = ValueAnimator.ofInt(0, 0);
private final Point mTempOffset = new Point();
private int mBottomInset;
// The following are only non null if mHasWorkProfile is true.
@Nullable private final WidgetsRecyclerView mWorkRecyclerView;
@@ -81,7 +84,8 @@ final class SearchAndRecommendationsScrollController implements
@Nullable WidgetsRecyclerView workRecyclerView,
WidgetsRecyclerView searchRecyclerView,
@Nullable View personalWorkTabsView,
@Nullable PersonalWorkPagedView primaryWorkViewPager) {
@Nullable PersonalWorkPagedView primaryWorkViewPager,
TextView noWidgetsView) {
mHasWorkProfile = hasWorkProfile;
mViewHolder = viewHolder;
mViewHolder.mContainer.setSearchAndRecommendationScrollController(this);
@@ -92,6 +96,7 @@ final class SearchAndRecommendationsScrollController implements
mPrimaryWorkTabsView = personalWorkTabsView;
mPrimaryWorkViewPager = primaryWorkViewPager;
mTabsHeight = tabsHeight;
mNoWidgetsView = noWidgetsView;
setCurrentRecyclerView(mPrimaryRecyclerView, /* animateReset= */ false);
}
@@ -113,6 +118,15 @@ final class SearchAndRecommendationsScrollController implements
reset(animateReset);
}
/**
* Updates padding of {@link WidgetsFullSheet} contents to include {@code bottomInset} wherever
* necessary.
*/
public boolean updateBottomInset(int bottomInset) {
mBottomInset = bottomInset;
return updateMarginAndPadding();
}
/**
* Updates the margin and padding of {@link WidgetsFullSheet} to accumulate collapsible views.
*
@@ -129,6 +143,8 @@ final class SearchAndRecommendationsScrollController implements
+ measureHeightWithVerticalMargins(mViewHolder.mRecommendedWidgetsTable);
int topContainerHeight = measureHeightWithVerticalMargins(mViewHolder.mContainer);
int noWidgetsViewHeight = topContainerHeight - mBottomInset;
if (mHasWorkProfile) {
mCollapsibleHeightForTabs = measureHeightWithVerticalMargins(mViewHolder.mHeaderTitle)
+ measureHeightWithVerticalMargins(mViewHolder.mRecommendedWidgetsTable);
@@ -180,6 +196,10 @@ final class SearchAndRecommendationsScrollController implements
int topOffsetAfterAllViewsCollapsed =
topContainerHeight + mTabsHeight - mCollapsibleHeightForTabs;
if (mPrimaryWorkTabsView.getVisibility() == View.VISIBLE) {
noWidgetsViewHeight += mTabsHeight;
}
RelativeLayout.LayoutParams viewPagerLayoutParams =
(RelativeLayout.LayoutParams) mPrimaryWorkViewPager.getLayoutParams();
if (viewPagerLayoutParams.topMargin != topOffsetAfterAllViewsCollapsed) {
@@ -222,6 +242,14 @@ final class SearchAndRecommendationsScrollController implements
mSearchRecyclerView.getPaddingBottom());
hasMarginOrPaddingUpdated = true;
}
if (mNoWidgetsView.getPaddingTop() != noWidgetsViewHeight) {
mNoWidgetsView.setPadding(
mNoWidgetsView.getPaddingLeft(),
noWidgetsViewHeight,
mNoWidgetsView.getPaddingRight(),
mNoWidgetsView.getPaddingBottom());
hasMarginOrPaddingUpdated = true;
}
return hasMarginOrPaddingUpdated;
}

View File

@@ -92,8 +92,8 @@ public class WidgetsFullSheet extends BaseWidgetSheet
private final boolean mHasWorkProfile;
private final SparseArray<AdapterHolder> mAdapters = new SparseArray();
private final UserHandle mCurrentUser = Process.myUserHandle();
private final Predicate<WidgetsListBaseEntry> mPrimaryWidgetsFilter = entry ->
mCurrentUser.equals(entry.mPkgItem.user);
private final Predicate<WidgetsListBaseEntry> mPrimaryWidgetsFilter =
entry -> mCurrentUser.equals(entry.mPkgItem.user);
private final Predicate<WidgetsListBaseEntry> mWorkWidgetsFilter =
mPrimaryWidgetsFilter.negate();
private final OnLayoutChangeListener mLayoutChangeListenerToShowTips =
@@ -131,6 +131,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet
@Nullable private WidgetsRecyclerView mCurrentWidgetsRecyclerView;
@Nullable private PersonalWorkPagedView mViewPager;
private boolean mIsInSearchMode;
private boolean mIsNoWidgetsViewNeeded;
private int mMaxSpansPerRow = 4;
private View mTabsView;
private TextView mNoWidgetsView;
@@ -187,6 +188,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet
layoutInflater.inflate(R.layout.widgets_full_sheet_search_and_recommendations, springLayout,
true);
mNoWidgetsView = findViewById(R.id.no_widgets_text);
mSearchAndRecommendationViewHolder = new SearchAndRecommendationViewHolder(
findViewById(R.id.search_and_recommendations_container));
mSearchAndRecommendationsScrollController = new SearchAndRecommendationsScrollController(
@@ -197,10 +199,10 @@ public class WidgetsFullSheet extends BaseWidgetSheet
mHasWorkProfile ? findViewById(R.id.work_widgets_list_view) : null,
findViewById(R.id.search_widgets_list_view),
mTabsView,
mViewPager);
mViewPager,
mNoWidgetsView);
fastScroller.setOnFastScrollChangeListener(mSearchAndRecommendationsScrollController);
mNoWidgetsView = findViewById(R.id.no_widgets_text);
onRecommendedWidgetsBound();
onWidgetsBound();
@@ -295,6 +297,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet
if (mHasWorkProfile) {
setBottomPadding(mAdapters.get(AdapterHolder.WORK).mWidgetsRecyclerView, insets.bottom);
}
mSearchAndRecommendationsScrollController.updateBottomInset(insets.bottom);
if (insets.bottom > 0) {
setupNavBarColor();
} else {
@@ -410,6 +413,16 @@ public class WidgetsFullSheet extends BaseWidgetSheet
} else {
updateRecyclerViewVisibility(primaryUserAdapterHolder);
}
// Update recommended widgets section so that it occupies appropriate space on screen to
// leave enough space for presence/absence of mNoWidgetsView.
boolean isNoWidgetsViewNeeded =
mAdapters.get(AdapterHolder.PRIMARY).mWidgetsListAdapter.getItemCount() == 0
|| (mHasWorkProfile && mAdapters.get(AdapterHolder.WORK)
.mWidgetsListAdapter.getItemCount() == 0);
if (mIsNoWidgetsViewNeeded != isNoWidgetsViewNeeded) {
mIsNoWidgetsViewNeeded = isNoWidgetsViewNeeded;
onRecommendedWidgetsBound();
}
}
@Override
@@ -476,9 +489,19 @@ public class WidgetsFullSheet extends BaseWidgetSheet
WidgetsRecommendationTableLayout table =
mSearchAndRecommendationViewHolder.mRecommendedWidgetsTable;
if (recommendedWidgets.size() > 0) {
float maxTableHeight =
(mActivityContext.getDeviceProfile().availableHeightPx - mTabsHeight
- getHeaderViewHeight()) * RECOMMENDATION_TABLE_HEIGHT_RATIO;
float noWidgetsViewHeight = 0;
if (mIsNoWidgetsViewNeeded) {
// Make sure recommended section leaves enough space for noWidgetsView.
Rect noWidgetsViewTextBounds = new Rect();
mNoWidgetsView.getPaint()
.getTextBounds(mNoWidgetsView.getText().toString(), /* start= */ 0,
mNoWidgetsView.getText().length(), noWidgetsViewTextBounds);
noWidgetsViewHeight = noWidgetsViewTextBounds.height();
}
float maxTableHeight = (mActivityContext.getDeviceProfile().availableHeightPx
- mTabsHeight - getHeaderViewHeight() - noWidgetsViewHeight)
* RECOMMENDATION_TABLE_HEIGHT_RATIO;
List<ArrayList<WidgetItem>> recommendedWidgetsInTable =
WidgetsTableUtils.groupWidgetItemsIntoTable(recommendedWidgets,
mMaxSpansPerRow);