diff options
author | Chihhang Chuang <chihhangchuang@google.com> | 2021-05-25 13:07:24 +0800 |
---|---|---|
committer | Chihhang Chuang <chihhangchuang@google.com> | 2021-05-27 00:45:28 +0800 |
commit | d0c5979f4f7946673e2e1c40c11638cf9fcbb97e (patch) | |
tree | 4550b6896760bf7d88aa770aa01d4f491044579c /src/com/android/customization/widget/OptionSelectorController.java | |
parent | b7dc51db6e8584b83959cbbcf2b0645233035f7d (diff) |
Update layout for grid options
Spec:
https://screenshot.googleplex.com/HeqNgrqnsaiMoia.png
Screenshot (1-5 options):
https://screenshot.googleplex.com/4sShjAjyu2xC8nw.png
https://screenshot.googleplex.com/3TThvJLr8omoMsm.png
https://screenshot.googleplex.com/BpGbpTdzPSNGCt5.png
https://screenshot.googleplex.com/BM3z8g9mcrTktr3.png
https://screenshot.googleplex.com/BegfDpyXwvMw6j3.png
Fixes: 187138127
Test: Manually
Change-Id: I92c541ce54a5c3144d6048407b2434d468680ca5
Diffstat (limited to 'src/com/android/customization/widget/OptionSelectorController.java')
-rw-r--r-- | src/com/android/customization/widget/OptionSelectorController.java | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/src/com/android/customization/widget/OptionSelectorController.java b/src/com/android/customization/widget/OptionSelectorController.java index f1d14c5b..9ecc0d26 100644 --- a/src/com/android/customization/widget/OptionSelectorController.java +++ b/src/com/android/customization/widget/OptionSelectorController.java @@ -15,8 +15,11 @@ */ package com.android.customization.widget; +import static com.android.internal.util.Preconditions.checkNotNull; + import android.content.Context; import android.content.res.Resources; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.text.TextUtils; @@ -72,6 +75,8 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { int CENTER = 2; } + private static final float LINEAR_LAYOUT_HORIZONTAL_DISPLAY_OPTIONS_MAX = 4.35f; + private final RecyclerView mContainer; private final List<T> mOptions; private final boolean mUseGrid; @@ -296,10 +301,10 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { availableWidth = fixWidth; } int totalWidth = mContainer.getMeasuredWidth(); + int widthPerItem = res.getDimensionPixelOffset(R.dimen.option_tile_width); if (mUseGrid) { int numColumns = res.getInteger(R.integer.options_grid_num_columns); - int widthPerItem = res.getDimensionPixelOffset(R.dimen.option_tile_width); int extraSpace = availableWidth - widthPerItem * numColumns; while (extraSpace < 0) { numColumns -= 1; @@ -316,12 +321,19 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { if (extraSpace >= 0) { mContainer.setOverScrollMode(View.OVER_SCROLL_NEVER); } - int itemSideMargin = res.getDimensionPixelOffset(R.dimen.option_tile_margin_horizontal); - int defaultTotalPadding = itemSideMargin * (mAdapter.getItemCount() * 2 + 2); - if (extraSpace > defaultTotalPadding) { - int spaceBetweenItems = extraSpace / (mAdapter.getItemCount() + 1); - itemSideMargin = spaceBetweenItems / 2; + + if (mAdapter.getItemCount() >= LINEAR_LAYOUT_HORIZONTAL_DISPLAY_OPTIONS_MAX) { + int spaceBetweenItems = availableWidth + - Math.round(widthPerItem * LINEAR_LAYOUT_HORIZONTAL_DISPLAY_OPTIONS_MAX) + - mContainer.getPaddingLeft(); + mContainer.addItemDecoration(new HorizontalBehindSpaceItemDecoration( + mContainer.getContext(), + spaceBetweenItems / (int) LINEAR_LAYOUT_HORIZONTAL_DISPLAY_OPTIONS_MAX)); + return; } + + int spaceBetweenItems = extraSpace / (mAdapter.getItemCount() + 1); + int itemSideMargin = spaceBetweenItems / 2; mContainer.addItemDecoration(new HorizontalSpacerItemDecoration(itemSideMargin)); } @@ -423,4 +435,35 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { return super.onRequestSendAccessibilityEvent(host, child, event); } } + + /** Custom ItemDecorator to add specific spacing between items in the list. */ + private static final class HorizontalBehindSpaceItemDecoration + extends RecyclerView.ItemDecoration { + private final int mHorizontalSpacePx; + private final boolean mDirectionLTR; + + private HorizontalBehindSpaceItemDecoration(Context context, int horizontalSpacePx) { + mDirectionLTR = context.getResources().getConfiguration().getLayoutDirection() + == View.LAYOUT_DIRECTION_LTR; + mHorizontalSpacePx = horizontalSpacePx; + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView recyclerView, + RecyclerView.State state) { + if (recyclerView.getAdapter() == null) { + return; + } + + if (recyclerView.getChildAdapterPosition(view) + != checkNotNull(recyclerView.getAdapter()).getItemCount() - 1) { + // Don't add spacing behind the last item + if (mDirectionLTR) { + outRect.right = mHorizontalSpacePx; + } else { + outRect.left = mHorizontalSpacePx; + } + } + } + } } |