From 830b4d0c9b3a459c0483934e2d7c336104beda58 Mon Sep 17 00:00:00 2001 From: evermind Date: Thu, 1 Dec 2022 08:23:25 +0100 Subject: [PATCH] searchfilters: make SearchFilterDialogGenerator DividerItem aware Refactor createUiChipElementsForFilterGroupItems and make this method aware of DividerItem Make classes inheritable (changes private to protected for some methods/variables) --- .../filter/SearchFilterDialogFragment.java | 2 +- .../filter/SearchFilterDialogGenerator.java | 104 +++++++++++++----- 2 files changed, 75 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/filter/SearchFilterDialogFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/filter/SearchFilterDialogFragment.java index 35b5b6072..581af4ae5 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/filter/SearchFilterDialogFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/filter/SearchFilterDialogFragment.java @@ -17,7 +17,7 @@ import androidx.appcompat.widget.Toolbar; */ public class SearchFilterDialogFragment extends BaseSearchFilterDialogFragment { - private SearchFilterDialogFragmentBinding binding; + protected SearchFilterDialogFragmentBinding binding; @Override protected BaseSearchFilterUiGenerator createSearchFilterDialogGenerator() { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/filter/SearchFilterDialogGenerator.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/filter/SearchFilterDialogGenerator.java index 6ce5abc44..cd29e5b33 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/filter/SearchFilterDialogGenerator.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/filter/SearchFilterDialogGenerator.java @@ -29,7 +29,7 @@ import androidx.annotation.Nullable; public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerator { private static final int CHIP_GROUP_ELEMENTS_THRESHOLD = 2; private static final int CHIP_MIN_TOUCH_TARGET_SIZE_DP = 40; - private final GridLayout globalLayout; + protected final GridLayout globalLayout; public SearchFilterDialogGenerator( @NonNull final SearchFilterLogic logic, @@ -67,16 +67,7 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat final TextView filterLabel; if (filterGroup.getNameId() != null) { - filterLabel = new TextView(context); - - filterLabel.setId(filterGroup.getIdentifier()); - filterLabel.setText( - ServiceHelper.getTranslatedFilterString(filterGroup.getNameId(), context)); - filterLabel.setGravity(Gravity.CENTER_VERTICAL); - setDefaultMargin(layoutParams); - setZeroPadding(filterLabel); - - filterLabel.setLayoutParams(layoutParams); + filterLabel = createFilterLabel(filterGroup, layoutParams); viewsWrapper.add(filterLabel); } else { filterLabel = null; @@ -113,13 +104,30 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat clipFreeRightColumnLayoutParams(doSpanDataOverMultipleCells)); chipGroup.setSingleLine(false); - createUiElementsForMultipleSelectableItemsFilterGroup( + createUiChipElementsForFilterGroupItems( filterGroup, wrapperDelegate, selectorDelegate, chipGroup); } wrapperDelegate.put(filterGroup.getIdentifier(), viewsWrapper); } + @NonNull + protected TextView createFilterLabel(@NonNull final FilterGroup filterGroup, + @NonNull final GridLayout.LayoutParams layoutParams) { + final TextView filterLabel; + filterLabel = new TextView(context); + + filterLabel.setId(filterGroup.getIdentifier()); + filterLabel.setText( + ServiceHelper.getTranslatedFilterString(filterGroup.getNameId(), context)); + filterLabel.setGravity(Gravity.CENTER_VERTICAL); + setDefaultMargin(layoutParams); + setZeroPadding(filterLabel); + + filterLabel.setLayoutParams(layoutParams); + return filterLabel; + } + private boolean chooseParentViewForFilterLabelAndAdd( @NonNull final FilterGroup filterGroup, final boolean doSpanDataOverMultipleCells, @@ -169,29 +177,65 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat filterDataSpinner.setOnItemSelectedListener(listener); } - private void createUiElementsForMultipleSelectableItemsFilterGroup( + protected void createUiChipElementsForFilterGroupItems( @NonNull final FilterGroup filterGroup, @NonNull final UiWrapperMapDelegate wrapperDelegate, @NonNull final UiSelectorDelegate selectorDelegate, @NonNull final ChipGroup chipGroup) { for (final FilterItem item : filterGroup.getFilterItems()) { - final Chip chip = (Chip) LayoutInflater.from(context).inflate( - R.layout.chip_search_filter, chipGroup, false); - chip.ensureAccessibleTouchTarget( - DeviceUtils.dpToPx(CHIP_MIN_TOUCH_TARGET_SIZE_DP, context)); - chip.setText(ServiceHelper.getTranslatedFilterString(item.getNameId(), context)); - chip.setId(item.getIdentifier()); - chip.setCheckable(true); - final View.OnClickListener listener; - listener = view -> selectorDelegate.selectFilter(view.getId()); - chip.setOnClickListener(listener); - chipGroup.addView(chip); - wrapperDelegate.put(item.getIdentifier(), new UiItemWrapperChip( - item, chip, chipGroup)); + if (item instanceof InjectFilterItem.DividerItem) { + final InjectFilterItem.DividerItem dividerItem = + (InjectFilterItem.DividerItem) item; + + final GridLayout.LayoutParams layoutParams = getLayoutParamsViews(); + final TextView dividerLabel = createDividerLabel(dividerItem, layoutParams); + chipGroup.addView(dividerLabel); + } else { + final Chip chip = createChipView(chipGroup, item); + + final View.OnClickListener listener; + listener = view -> selectorDelegate.selectFilter(view.getId()); + chip.setOnClickListener(listener); + + chipGroup.addView(chip); + wrapperDelegate.put(item.getIdentifier(), + new UiItemWrapperChip(item, chip, chipGroup)); + } } } + @NonNull + private Chip createChipView(@NonNull final ChipGroup chipGroup, + @NonNull final FilterItem item) { + final Chip chip = (Chip) LayoutInflater.from(context).inflate( + R.layout.chip_search_filter, chipGroup, false); + chip.ensureAccessibleTouchTarget( + DeviceUtils.dpToPx(CHIP_MIN_TOUCH_TARGET_SIZE_DP, context)); + chip.setText(ServiceHelper.getTranslatedFilterString(item.getNameId(), context)); + chip.setId(item.getIdentifier()); + chip.setCheckable(true); + return chip; + } + + @NonNull + private TextView createDividerLabel( + @NonNull final InjectFilterItem.DividerItem dividerItem, + @NonNull final GridLayout.LayoutParams layoutParams) { + final TextView dividerLabel; + dividerLabel = new TextView(context); + dividerLabel.setEnabled(true); + + dividerLabel.setGravity(Gravity.CENTER_VERTICAL); + setDefaultMargin(layoutParams); + layoutParams.height = DeviceUtils.dpToPx(CHIP_MIN_TOUCH_TARGET_SIZE_DP, context); + dividerLabel.setLayoutParams(layoutParams); + final String menuDividerTitle = + context.getString(dividerItem.getStringResId()) + ":"; + dividerLabel.setText(menuDividerTitle); + return dividerLabel; + } + @NonNull private View createSeparatorLine() { return createSeparatorLine(clipFreeRightColumnLayoutParams(true)); @@ -221,7 +265,7 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat } @NonNull - private GridLayout.LayoutParams clipFreeRightColumnLayoutParams(final boolean doColumnSpan) { + protected GridLayout.LayoutParams clipFreeRightColumnLayoutParams(final boolean doColumnSpan) { final GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(); // https://stackoverflow.com/questions/37744672/gridlayout-children-are-being-clipped layoutParams.width = 0; @@ -245,8 +289,8 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat } @NonNull - private GridLayout.LayoutParams setDefaultMargin( - @NonNull final GridLayout.LayoutParams layoutParams) { + protected ViewGroup.MarginLayoutParams setDefaultMargin( + @NonNull final ViewGroup.MarginLayoutParams layoutParams) { layoutParams.setMargins( DeviceUtils.dpToPx(4, context), DeviceUtils.dpToPx(2, context), @@ -257,7 +301,7 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat } @NonNull - private View setZeroPadding(@NonNull final View view) { + protected View setZeroPadding(@NonNull final View view) { view.setPadding(0, 0, 0, 0); return view; }