From c4dbdbd2e6538ce67eff9caae073eb6221e71c37 Mon Sep 17 00:00:00 2001 From: arangelov Date: Tue, 18 Feb 2020 20:54:16 +0000 Subject: [PATCH] Fix sharesheet height expansion. This CL does the following things: - Add an isIntentResolver check for cases when we want logic to only apply to ResolverActivity, but not ChooserActivity. - Gracefully handle the sticky content preview loading. Preload it if it will ever be shown, in order to avoid sudden changes in the share sheet height. - Don't recalculate the share sheet height when changing tabs. - Recalculate the share sheet height if the number of recycler view children has changed in the cases when we last calculated it when it wasn't populated yet Test: manual Bug: 149817068 Bug: 148156663 Bug: 149823253 Bug: 149732754 Change-Id: If74fc36bd3b8bfa5aa1d91c042fa99e4d19899c9 --- .../app/AbstractMultiProfilePagerAdapter.java | 5 +- .../android/internal/app/ChooserActivity.java | 67 ++++++++++++++----- .../app/ChooserMultiProfilePagerAdapter.java | 1 - .../internal/app/ResolverActivity.java | 9 +++ .../app/ResolverMultiProfilePagerAdapter.java | 6 ++ .../internal/app/ResolverViewPager.java | 2 +- core/res/res/layout/chooser_grid.xml | 2 +- core/res/res/layout/resolver_list.xml | 2 +- core/res/res/values/dimens.xml | 2 + core/res/res/values/symbols.xml | 1 + 10 files changed, 75 insertions(+), 22 deletions(-) diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java index b4a0208ccc914..0bd680e2d1d33 100644 --- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java @@ -144,7 +144,6 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { @Override public ViewGroup instantiateItem(ViewGroup container, int position) { final ProfileDescriptor profileDescriptor = getItem(position); - setupListAdapter(position); container.addView(profileDescriptor.rootView); return profileDescriptor.rootView; } @@ -198,8 +197,8 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { abstract int getItemCount(); /** - * Responsible for assigning an adapter to the list view for the relevant page, specified by - * pageIndex, and other list view-related initialization procedures. + * Performs view-related initialization procedures for the adapter specified + * by pageIndex. */ abstract void setupListAdapter(int pageIndex); diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 250b1ea5a4e96..38fd560eae46c 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -241,6 +241,7 @@ public class ChooserActivity extends ResolverActivity implements private int mChooserRowServiceSpacing; private int mCurrAvailableWidth = 0; + private int mLastNumberOfChildren = -1; private static final String TARGET_DETAILS_FRAGMENT_TAG = "targetDetailsFragment"; // TODO: Update to handle landscape instead of using static value @@ -967,6 +968,7 @@ public class ChooserActivity extends ResolverActivity implements super.onConfigurationChanged(newConfig); adjustPreviewWidth(newConfig.orientation, null); + updateStickyContentPreview(); } private boolean shouldDisplayLandscape(int orientation) { @@ -987,8 +989,6 @@ public class ChooserActivity extends ResolverActivity implements updateLayoutWidth(R.id.content_preview_text_layout, width, parent); updateLayoutWidth(R.id.content_preview_title_layout, width, parent); updateLayoutWidth(R.id.content_preview_file_layout, width, parent); - findViewById(R.id.content_preview_container) - .setVisibility(shouldShowStickyContentPreview() ? View.VISIBLE : View.GONE); } private void updateLayoutWidth(int layoutResourceId, int width, View parent) { @@ -2398,14 +2398,17 @@ public class ChooserActivity extends ResolverActivity implements } final int availableWidth = right - left - v.getPaddingLeft() - v.getPaddingRight(); + if (mChooserMultiProfilePagerAdapter.getCurrentUserHandle() != getUser()) { + gridAdapter.calculateChooserTargetWidth(availableWidth); + return; + } + if (gridAdapter.consumeLayoutRequest() || gridAdapter.calculateChooserTargetWidth(availableWidth) || recyclerView.getAdapter() == null + || mLastNumberOfChildren != recyclerView.getChildCount() || availableWidth != mCurrAvailableWidth) { mCurrAvailableWidth = availableWidth; - recyclerView.setAdapter(gridAdapter); - ((GridLayoutManager) recyclerView.getLayoutManager()) - .setSpanCount(gridAdapter.getMaxTargetsPerRow()); getMainThreadHandler().post(() -> { if (mResolverDrawerLayout == null || gridAdapter == null) { @@ -2415,7 +2418,8 @@ public class ChooserActivity extends ResolverActivity implements final int bottomInset = mSystemWindowInsets != null ? mSystemWindowInsets.bottom : 0; int offset = bottomInset; - int rowsToShow = gridAdapter.getProfileRowCount() + int rowsToShow = gridAdapter.getContentPreviewRowCount() + + gridAdapter.getProfileRowCount() + gridAdapter.getServiceTargetRowCount() + gridAdapter.getCallerAndRankedTargetRowCount(); @@ -2434,8 +2438,9 @@ public class ChooserActivity extends ResolverActivity implements return; } - if (shouldShowStickyContentPreview()) { - offset += findViewById(R.id.content_preview_container).getHeight(); + View stickyContentPreview = findViewById(R.id.content_preview_container); + if (shouldShowStickyContentPreview() && isStickyContentPreviewShowing()) { + offset += stickyContentPreview.getHeight(); } if (shouldShowTabs()) { @@ -2444,6 +2449,7 @@ public class ChooserActivity extends ResolverActivity implements int directShareHeight = 0; rowsToShow = Math.min(4, rowsToShow); + mLastNumberOfChildren = recyclerView.getChildCount(); for (int i = 0, childCount = recyclerView.getChildCount(); i < childCount && rowsToShow > 0; i++) { View child = recyclerView.getChildAt(i); @@ -2526,6 +2532,14 @@ public class ChooserActivity extends ResolverActivity implements setupScrollListener(); ChooserListAdapter chooserListAdapter = (ChooserListAdapter) listAdapter; + if (chooserListAdapter.getUserHandle() + == mChooserMultiProfilePagerAdapter.getCurrentUserHandle()) { + mChooserMultiProfilePagerAdapter.getActiveAdapterView() + .setAdapter(mChooserMultiProfilePagerAdapter.getCurrentRootAdapter()); + mChooserMultiProfilePagerAdapter + .setupListAdapter(mChooserMultiProfilePagerAdapter.getCurrentPage()); + } + if (chooserListAdapter.mDisplayList == null || chooserListAdapter.mDisplayList.isEmpty()) { chooserListAdapter.notifyDataSetChanged(); @@ -2617,14 +2631,29 @@ public class ChooserActivity extends ResolverActivity implements * we instead show the content preview as a regular list item. */ private boolean shouldShowStickyContentPreview() { - return shouldShowTabs() - && mMultiProfilePagerAdapter.getListAdapterForUserHandle( - UserHandle.of(UserHandle.myUserId())).getCount() > 0 - && isSendAction(getTargetIntent()) + return shouldShowStickyContentPreviewNoOrientationCheck() && getResources().getBoolean(R.bool.sharesheet_show_content_preview); } + private boolean shouldShowStickyContentPreviewNoOrientationCheck() { + return shouldShowTabs() + && mMultiProfilePagerAdapter.getListAdapterForUserHandle( + UserHandle.of(UserHandle.myUserId())).getCount() > 0 + && isSendAction(getTargetIntent()); + } + private void updateStickyContentPreview() { + if (shouldShowStickyContentPreviewNoOrientationCheck()) { + // The sticky content preview is only shown when we show the work and personal tabs. + // We don't show it in landscape as otherwise there is no room for scrolling. + // If the sticky content preview will be shown at some point with orientation change, + // then always preload it to avoid subsequent resizing of the share sheet. + ViewGroup contentPreviewContainer = findViewById(R.id.content_preview_container); + if (contentPreviewContainer.getChildCount() == 0) { + ViewGroup contentPreviewView = createContentPreviewView(contentPreviewContainer); + contentPreviewContainer.addView(contentPreviewView); + } + } if (shouldShowStickyContentPreview()) { showStickyContentPreview(); } else { @@ -2633,15 +2662,23 @@ public class ChooserActivity extends ResolverActivity implements } private void showStickyContentPreview() { + if (isStickyContentPreviewShowing()) { + return; + } ViewGroup contentPreviewContainer = findViewById(R.id.content_preview_container); contentPreviewContainer.setVisibility(View.VISIBLE); - ViewGroup contentPreviewView = createContentPreviewView(contentPreviewContainer); - contentPreviewContainer.addView(contentPreviewView); + } + + private boolean isStickyContentPreviewShowing() { + ViewGroup contentPreviewContainer = findViewById(R.id.content_preview_container); + return contentPreviewContainer.getVisibility() == View.VISIBLE; } private void hideStickyContentPreview() { + if (!isStickyContentPreviewShowing()) { + return; + } ViewGroup contentPreviewContainer = findViewById(R.id.content_preview_container); - contentPreviewContainer.removeAllViews(); contentPreviewContainer.setVisibility(View.GONE); } diff --git a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java index d4404023c4f43..b39d42ec1e96e 100644 --- a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java @@ -106,7 +106,6 @@ public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAd final RecyclerView recyclerView = getItem(pageIndex).recyclerView; ChooserActivity.ChooserGridAdapter chooserGridAdapter = getItem(pageIndex).chooserGridAdapter; - recyclerView.setAdapter(chooserGridAdapter); GridLayoutManager glm = (GridLayoutManager) recyclerView.getLayoutManager(); glm.setSpanCount(chooserGridAdapter.getMaxTargetsPerRow()); glm.setSpanSizeLookup( diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index ed1b6a3485a14..0aad8edad07a3 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -396,6 +396,11 @@ public class ResolverActivity extends Activity implements | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); rdl.setOnApplyWindowInsetsListener(this::onApplyWindowInsets); + if (shouldShowTabs() && isIntentPicker()) { + rdl.setMaxCollapsedHeight(getResources() + .getDimensionPixelSize(R.dimen.resolver_max_collapsed_height_with_tabs)); + } + mResolverDrawerLayout = rdl; } @@ -413,6 +418,10 @@ public class ResolverActivity extends Activity implements + (categories != null ? Arrays.toString(categories.toArray()) : "")); } + private boolean isIntentPicker() { + return getClass().equals(ResolverActivity.class); + } + protected AbstractMultiProfilePagerAdapter createMultiProfilePagerAdapter( Intent[] initialIntents, List rList, diff --git a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java index 21e7fd9fcca6a..f6382d397d6f3 100644 --- a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java @@ -93,6 +93,12 @@ public class ResolverMultiProfilePagerAdapter extends AbstractMultiProfilePagerA return mItems[pageIndex].resolverListAdapter; } + @Override + public ViewGroup instantiateItem(ViewGroup container, int position) { + setupListAdapter(position); + return super.instantiateItem(container, position); + } + @Override @Nullable ResolverListAdapter getListAdapterForUserHandle(UserHandle userHandle) { diff --git a/core/java/com/android/internal/app/ResolverViewPager.java b/core/java/com/android/internal/app/ResolverViewPager.java index 87a53161d7a59..4eb6e3bd2071c 100644 --- a/core/java/com/android/internal/app/ResolverViewPager.java +++ b/core/java/com/android/internal/app/ResolverViewPager.java @@ -26,7 +26,7 @@ import com.android.internal.widget.ViewPager; * A {@link ViewPager} which wraps around its tallest child's height. *

Normally {@link ViewPager} instances expand their height to cover all remaining space in * the layout. - *

This class is used for the intent resolver's tabbed view. + *

This class is used for the intent resolver and share sheet's tabbed view. */ public class ResolverViewPager extends ViewPager { diff --git a/core/res/res/layout/chooser_grid.xml b/core/res/res/layout/chooser_grid.xml index 5676049fb940f..c0de6936dd128 100644 --- a/core/res/res/layout/chooser_grid.xml +++ b/core/res/res/layout/chooser_grid.xml @@ -90,7 +90,7 @@ android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="wrap_content"> - diff --git a/core/res/res/layout/resolver_list.xml b/core/res/res/layout/resolver_list.xml index c923b153c5068..d940376dd3e86 100644 --- a/core/res/res/layout/resolver_list.xml +++ b/core/res/res/layout/resolver_list.xml @@ -21,7 +21,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:maxWidth="@dimen/resolver_max_width" - android:maxCollapsedHeight="192dp" + android:maxCollapsedHeight="@dimen/resolver_max_collapsed_height" android:maxCollapsedHeightSmall="56dp" android:id="@id/contentPanel"> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index e1d94f50f2607..c537156799742 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -778,6 +778,8 @@ 1dp 212dp 268dp + 192dp + 248dp 18dp diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 3ed3a64e2cb49..8b0e051c48e95 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3893,6 +3893,7 @@ +