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 8430ae84f..6ce5abc44 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 @@ -4,6 +4,7 @@ package org.schabi.newpipe.fragments.list.search.filter; import android.content.Context; import android.view.Gravity; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -23,9 +24,11 @@ import org.schabi.newpipe.util.ServiceHelper; import java.util.List; import androidx.annotation.NonNull; -import androidx.appcompat.view.ContextThemeWrapper; +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; public SearchFilterDialogGenerator( @@ -62,8 +65,9 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat final UiItemWrapperViews viewsWrapper = new UiItemWrapperViews( filterGroup.getIdentifier()); + final TextView filterLabel; if (filterGroup.getNameId() != null) { - final TextView filterLabel = new TextView(context); + filterLabel = new TextView(context); filterLabel.setId(filterGroup.getIdentifier()); filterLabel.setText( @@ -73,13 +77,16 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat setZeroPadding(filterLabel); filterLabel.setLayoutParams(layoutParams); - globalLayout.addView(filterLabel); viewsWrapper.add(filterLabel); } else { + filterLabel = null; doSpanDataOverMultipleCells = true; } if (filterGroup.isOnlyOneCheckable()) { + if (filterLabel != null) { + globalLayout.addView(filterLabel); + } final Spinner filterDataSpinner = new Spinner(context, Spinner.MODE_DROPDOWN); @@ -97,6 +104,9 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat } else { // multiple items in FilterGroup selectable final ChipGroup chipGroup = new ChipGroup(context); + doSpanDataOverMultipleCells = chooseParentViewForFilterLabelAndAdd( + filterGroup, doSpanDataOverMultipleCells, filterLabel, chipGroup); + viewsWrapper.add(chipGroup); globalLayout.addView(chipGroup); chipGroup.setLayoutParams( @@ -110,6 +120,28 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat wrapperDelegate.put(filterGroup.getIdentifier(), viewsWrapper); } + private boolean chooseParentViewForFilterLabelAndAdd( + @NonNull final FilterGroup filterGroup, + final boolean doSpanDataOverMultipleCells, + @Nullable final TextView filterLabel, + @NonNull final ChipGroup possibleParentView) { + + boolean spanOverMultipleCells = doSpanDataOverMultipleCells; + if (filterLabel != null) { + // If we have more than CHIP_GROUP_ELEMENTS_THRESHOLD elements to be + // displayed as Chips add its filterLabel as first element to ChipGroup. + // Now the ChipGroup can be spanned over all the cells to use + // the space better. + if (filterGroup.getFilterItems().size() > CHIP_GROUP_ELEMENTS_THRESHOLD) { + possibleParentView.addView(filterLabel); + spanOverMultipleCells = true; + } else { + globalLayout.addView(filterLabel); + } + } + return spanOverMultipleCells; + } + private void createUiElementsForSingleSelectableItemsFilterGroup( @NonNull final FilterGroup filterGroup, @NonNull final UiWrapperMapDelegate wrapperDelegate, @@ -143,8 +175,10 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat @NonNull final UiSelectorDelegate selectorDelegate, @NonNull final ChipGroup chipGroup) { for (final FilterItem item : filterGroup.getFilterItems()) { - final Chip chip = new Chip(new ContextThemeWrapper( - context, R.style.Theme_MaterialComponents_Light)); + 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); @@ -205,7 +239,7 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat @NonNull private GridLayout.LayoutParams getLayoutParamsViews() { final GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(); - layoutParams.setGravity(Gravity.TOP); + layoutParams.setGravity(Gravity.CENTER_VERTICAL); setDefaultMargin(layoutParams); return layoutParams; } @@ -247,7 +281,6 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat @Override public void setChecked(final boolean checked) { - view.setSelected(checked); ((Chip) view).setChecked(checked); if (checked) { diff --git a/app/src/main/res/color/mtrl_search_filter_chip_background_color.xml b/app/src/main/res/color/mtrl_search_filter_chip_background_color.xml new file mode 100644 index 000000000..1bea84d4e --- /dev/null +++ b/app/src/main/res/color/mtrl_search_filter_chip_background_color.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/chip_search_filter.xml b/app/src/main/res/layout/chip_search_filter.xml new file mode 100644 index 000000000..58fd1b5ab --- /dev/null +++ b/app/src/main/res/layout/chip_search_filter.xml @@ -0,0 +1,9 @@ + + + + diff --git a/app/src/main/res/layout/search_filter_dialog_fragment.xml b/app/src/main/res/layout/search_filter_dialog_fragment.xml index 0747e8e36..8d375a04b 100644 --- a/app/src/main/res/layout/search_filter_dialog_fragment.xml +++ b/app/src/main/res/layout/search_filter_dialog_fragment.xml @@ -1,7 +1,7 @@ + android:layout_height="wrap_content" > + android:layout_height="wrap_content" + android:layout_below="@id/toolbar_layout"> + + +