Loading src/com/android/customization/widget/OptionSelectorController.java +58 −60 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.customization.model.CustomizationManager; import com.android.customization.model.CustomizationOption; import com.android.wallpaper.R; import com.android.wallpaper.widget.GridPaddingDecoration; import com.android.wallpaper.widget.GridRowSpacerDecoration; import java.util.HashSet; import java.util.List; Loading Loading @@ -84,7 +85,8 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { private final RecyclerView mContainer; private final List<T> mOptions; private final boolean mUseGrid; @CheckmarkStyle private final int mCheckmarkStyle; @CheckmarkStyle private final int mCheckmarkStyle; private final Set<OptionSelectedListener> mListeners = new HashSet<>(); private RecyclerView.Adapter<TileViewHolder> mAdapter; Loading Loading @@ -141,7 +143,6 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { /** * Mark an option as the one which is currently applied on the device. This will result in a * check being displayed in the lower-right corner of the corresponding ViewHolder. * @param option */ public void setAppliedOption(T option) { if (!mOptions.contains(option)) { Loading @@ -157,6 +158,7 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { /** * Notify that a given option has changed. * * @param option the option that changed */ public void optionChanged(T option) { Loading Loading @@ -282,51 +284,44 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { }; Resources res = mContainer.getContext().getResources(); if (mUseGrid) { mContainer.setLayoutManager(new GridLayoutManager(mContainer.getContext(), res.getInteger(R.integer.options_grid_num_columns))); } else { mContainer.setLayoutManager(new LinearLayoutManager(mContainer.getContext(), LinearLayoutManager.HORIZONTAL, false)); } mContainer.setAdapter(mAdapter); // Measure RecyclerView to get to the total amount of space used by all options. mContainer.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int fixWidth = res.getDimensionPixelSize(R.dimen.options_container_width); int availableWidth; if (fixWidth == 0) { DisplayMetrics metrics = new DisplayMetrics(); final int padding = res.getDimensionPixelSize( R.dimen.option_tile_grid_padding_horizontal); final int fixWidth = res.getDimensionPixelSize(R.dimen.options_container_width); final DisplayMetrics metrics = new DisplayMetrics(); mContainer.getContext().getSystemService(WindowManager.class) .getDefaultDisplay().getMetrics(metrics); availableWidth = metrics.widthPixels; } else { availableWidth = fixWidth; } int totalWidth = mContainer.getMeasuredWidth(); int widthPerItem = res.getDimensionPixelOffset(R.dimen.option_tile_width); // This is based on the assumption that the parent view is the same width as the screen. final int availableDynamicWidth = metrics.widthPixels - 2 * res.getDimensionPixelSize( R.dimen.section_horizontal_padding) - 2 * padding; final int availableWidth = (fixWidth != 0) ? fixWidth : availableDynamicWidth; final boolean hasDecoration = mContainer.getItemDecorationCount() != 0; final int widthPerItem = res.getDimensionPixelSize(R.dimen.option_tile_width) + ( hasDecoration ? 0 : 2 * padding); if (mUseGrid) { int numColumns = res.getInteger(R.integer.options_grid_num_columns); int extraSpace = availableWidth - widthPerItem * numColumns; while (extraSpace < 0) { GridLayoutManager gridLayoutManager = new GridLayoutManager(mContainer.getContext(), numColumns); mContainer.setLayoutManager(gridLayoutManager); // Measure RecyclerView to get to the total amount of space used by all options. mContainer.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); while (mContainer.getMeasuredWidth() > availableWidth && numColumns > 1) { numColumns -= 1; extraSpace = availableWidth - widthPerItem * numColumns; gridLayoutManager.setSpanCount(numColumns); mContainer.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); } if (mContainer.getLayoutManager() != null) { ((GridLayoutManager) mContainer.getLayoutManager()).setSpanCount(numColumns); if (!hasDecoration) { mContainer.addItemDecoration(new GridPaddingDecoration(padding, 0)); if (numColumns > 1) { mContainer.addItemDecoration(new GridRowSpacerDecoration(2 * padding)); } if (mContainer.getItemDecorationCount() == 0) { mContainer.addItemDecoration(new GridPaddingDecoration( mContainer.getContext().getResources().getDimensionPixelSize( R.dimen.option_tile_grid_padding_horizontal), 0)); } return; } int extraSpace = availableWidth - totalWidth; } else { mContainer.setLayoutManager(new LinearLayoutManager(mContainer.getContext(), LinearLayoutManager.HORIZONTAL, false)); int extraSpace = availableWidth - mContainer.getMeasuredWidth(); if (extraSpace >= 0) { mContainer.setOverScrollMode(View.OVER_SCROLL_NEVER); } Loading @@ -338,7 +333,8 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { int itemEndMargin = spaceBetweenItems / (int) mLinearLayoutHorizontalDisplayOptionsMax; if (itemEndMargin <= 0) { itemEndMargin = res.getDimensionPixelOffset(R.dimen.option_tile_margin_horizontal); itemEndMargin = res.getDimensionPixelOffset( R.dimen.option_tile_margin_horizontal); } mContainer.addItemDecoration(new ItemEndHorizontalSpaceItemDecoration( mContainer.getContext(), itemEndMargin)); Loading @@ -349,6 +345,7 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { int itemSideMargin = spaceBetweenItems / 2; mContainer.addItemDecoration(new HorizontalSpacerItemDecoration(itemSideMargin)); } } public void resetOptions(List<T> options) { mOptions.clear(); Loading Loading @@ -382,6 +379,7 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { /** * Set the content description for this holder using the given string id. * If the option does not have a label, the description will be set on the tile view. * * @param context The view's context * @param option The customization option * @param id Resource ID of the string to use for the content description Loading Loading
src/com/android/customization/widget/OptionSelectorController.java +58 −60 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.customization.model.CustomizationManager; import com.android.customization.model.CustomizationOption; import com.android.wallpaper.R; import com.android.wallpaper.widget.GridPaddingDecoration; import com.android.wallpaper.widget.GridRowSpacerDecoration; import java.util.HashSet; import java.util.List; Loading Loading @@ -84,7 +85,8 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { private final RecyclerView mContainer; private final List<T> mOptions; private final boolean mUseGrid; @CheckmarkStyle private final int mCheckmarkStyle; @CheckmarkStyle private final int mCheckmarkStyle; private final Set<OptionSelectedListener> mListeners = new HashSet<>(); private RecyclerView.Adapter<TileViewHolder> mAdapter; Loading Loading @@ -141,7 +143,6 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { /** * Mark an option as the one which is currently applied on the device. This will result in a * check being displayed in the lower-right corner of the corresponding ViewHolder. * @param option */ public void setAppliedOption(T option) { if (!mOptions.contains(option)) { Loading @@ -157,6 +158,7 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { /** * Notify that a given option has changed. * * @param option the option that changed */ public void optionChanged(T option) { Loading Loading @@ -282,51 +284,44 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { }; Resources res = mContainer.getContext().getResources(); if (mUseGrid) { mContainer.setLayoutManager(new GridLayoutManager(mContainer.getContext(), res.getInteger(R.integer.options_grid_num_columns))); } else { mContainer.setLayoutManager(new LinearLayoutManager(mContainer.getContext(), LinearLayoutManager.HORIZONTAL, false)); } mContainer.setAdapter(mAdapter); // Measure RecyclerView to get to the total amount of space used by all options. mContainer.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int fixWidth = res.getDimensionPixelSize(R.dimen.options_container_width); int availableWidth; if (fixWidth == 0) { DisplayMetrics metrics = new DisplayMetrics(); final int padding = res.getDimensionPixelSize( R.dimen.option_tile_grid_padding_horizontal); final int fixWidth = res.getDimensionPixelSize(R.dimen.options_container_width); final DisplayMetrics metrics = new DisplayMetrics(); mContainer.getContext().getSystemService(WindowManager.class) .getDefaultDisplay().getMetrics(metrics); availableWidth = metrics.widthPixels; } else { availableWidth = fixWidth; } int totalWidth = mContainer.getMeasuredWidth(); int widthPerItem = res.getDimensionPixelOffset(R.dimen.option_tile_width); // This is based on the assumption that the parent view is the same width as the screen. final int availableDynamicWidth = metrics.widthPixels - 2 * res.getDimensionPixelSize( R.dimen.section_horizontal_padding) - 2 * padding; final int availableWidth = (fixWidth != 0) ? fixWidth : availableDynamicWidth; final boolean hasDecoration = mContainer.getItemDecorationCount() != 0; final int widthPerItem = res.getDimensionPixelSize(R.dimen.option_tile_width) + ( hasDecoration ? 0 : 2 * padding); if (mUseGrid) { int numColumns = res.getInteger(R.integer.options_grid_num_columns); int extraSpace = availableWidth - widthPerItem * numColumns; while (extraSpace < 0) { GridLayoutManager gridLayoutManager = new GridLayoutManager(mContainer.getContext(), numColumns); mContainer.setLayoutManager(gridLayoutManager); // Measure RecyclerView to get to the total amount of space used by all options. mContainer.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); while (mContainer.getMeasuredWidth() > availableWidth && numColumns > 1) { numColumns -= 1; extraSpace = availableWidth - widthPerItem * numColumns; gridLayoutManager.setSpanCount(numColumns); mContainer.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); } if (mContainer.getLayoutManager() != null) { ((GridLayoutManager) mContainer.getLayoutManager()).setSpanCount(numColumns); if (!hasDecoration) { mContainer.addItemDecoration(new GridPaddingDecoration(padding, 0)); if (numColumns > 1) { mContainer.addItemDecoration(new GridRowSpacerDecoration(2 * padding)); } if (mContainer.getItemDecorationCount() == 0) { mContainer.addItemDecoration(new GridPaddingDecoration( mContainer.getContext().getResources().getDimensionPixelSize( R.dimen.option_tile_grid_padding_horizontal), 0)); } return; } int extraSpace = availableWidth - totalWidth; } else { mContainer.setLayoutManager(new LinearLayoutManager(mContainer.getContext(), LinearLayoutManager.HORIZONTAL, false)); int extraSpace = availableWidth - mContainer.getMeasuredWidth(); if (extraSpace >= 0) { mContainer.setOverScrollMode(View.OVER_SCROLL_NEVER); } Loading @@ -338,7 +333,8 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { int itemEndMargin = spaceBetweenItems / (int) mLinearLayoutHorizontalDisplayOptionsMax; if (itemEndMargin <= 0) { itemEndMargin = res.getDimensionPixelOffset(R.dimen.option_tile_margin_horizontal); itemEndMargin = res.getDimensionPixelOffset( R.dimen.option_tile_margin_horizontal); } mContainer.addItemDecoration(new ItemEndHorizontalSpaceItemDecoration( mContainer.getContext(), itemEndMargin)); Loading @@ -349,6 +345,7 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { int itemSideMargin = spaceBetweenItems / 2; mContainer.addItemDecoration(new HorizontalSpacerItemDecoration(itemSideMargin)); } } public void resetOptions(List<T> options) { mOptions.clear(); Loading Loading @@ -382,6 +379,7 @@ public class OptionSelectorController<T extends CustomizationOption<T>> { /** * Set the content description for this holder using the given string id. * If the option does not have a label, the description will be set on the tile view. * * @param context The view's context * @param option The customization option * @param id Resource ID of the string to use for the content description Loading