searchfilters: annotate methods and parameters with Nullable or NotNull inside search/filter/.*

This commit is contained in:
evermind 2022-11-17 00:03:21 +01:00
parent f24fdcd9e3
commit a4b8c0b3fd
15 changed files with 256 additions and 163 deletions

View file

@ -12,6 +12,8 @@ import org.schabi.newpipe.extractor.search.filter.FilterItem;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
/** /**
* Common base for the {@link SearchFilterDialogGenerator} and * Common base for the {@link SearchFilterDialogGenerator} and
* {@link SearchFilterOptionMenuAlikeDialogGenerator}'s * {@link SearchFilterOptionMenuAlikeDialogGenerator}'s
@ -20,13 +22,16 @@ import java.util.List;
public abstract class BaseCreateSearchFilterUI public abstract class BaseCreateSearchFilterUI
implements SearchFilterLogic.ICreateUiForFiltersWorker { implements SearchFilterLogic.ICreateUiForFiltersWorker {
@NonNull
protected final BaseSearchFilterUiDialogGenerator dialogGenBase; protected final BaseSearchFilterUiDialogGenerator dialogGenBase;
@NonNull
protected final Context context; protected final Context context;
protected final List<View> titleViewElements = new ArrayList<>(); protected final List<View> titleViewElements = new ArrayList<>();
protected int titleResId; protected int titleResId;
protected BaseCreateSearchFilterUI(final BaseSearchFilterUiDialogGenerator dialogGenBase, protected BaseCreateSearchFilterUI(
final Context context, @NonNull final BaseSearchFilterUiDialogGenerator dialogGenBase,
@NonNull final Context context,
final int titleResId) { final int titleResId) {
this.dialogGenBase = dialogGenBase; this.dialogGenBase = dialogGenBase;
this.context = context; this.context = context;
@ -34,12 +39,13 @@ public abstract class BaseCreateSearchFilterUI
} }
@Override @Override
public void createFilterItem(final FilterItem filterItem, final FilterGroup filterGroup) { public void createFilterItem(@NonNull final FilterItem filterItem,
@NonNull final FilterGroup filterGroup) {
// no implementation here all creation stuff is done in createFilterGroupBeforeItems // no implementation here all creation stuff is done in createFilterGroupBeforeItems
} }
@Override @Override
public void createFilterGroupAfterItems(final FilterGroup filterGroup) { public void createFilterGroupAfterItems(@NonNull final FilterGroup filterGroup) {
// no implementation here all creation stuff is done in createFilterGroupBeforeItems // no implementation here all creation stuff is done in createFilterGroupBeforeItems
} }
@ -66,15 +72,16 @@ public abstract class BaseCreateSearchFilterUI
public static class CreateContentFilterUI extends CreateSortFilterUI { public static class CreateContentFilterUI extends CreateSortFilterUI {
public CreateContentFilterUI(final BaseSearchFilterUiDialogGenerator dialogGenBase, public CreateContentFilterUI(
final Context context) { @NonNull final BaseSearchFilterUiDialogGenerator dialogGenBase,
@NonNull final Context context) {
super(dialogGenBase, context); super(dialogGenBase, context);
this.titleResId = R.string.filter_search_content_filters; this.titleResId = R.string.filter_search_content_filters;
} }
@Override @Override
public void createFilterGroupBeforeItems( public void createFilterGroupBeforeItems(
final FilterGroup filterGroup) { @NonNull final FilterGroup filterGroup) {
dialogGenBase.createFilterGroup(filterGroup, dialogGenBase.createFilterGroup(filterGroup,
dialogGenBase::addContentFilterUiWrapperToItemMap, dialogGenBase::addContentFilterUiWrapperToItemMap,
dialogGenBase::selectContentFilter); dialogGenBase::selectContentFilter);
@ -88,8 +95,9 @@ public abstract class BaseCreateSearchFilterUI
public static class CreateSortFilterUI extends BaseCreateSearchFilterUI { public static class CreateSortFilterUI extends BaseCreateSearchFilterUI {
public CreateSortFilterUI(final BaseSearchFilterUiDialogGenerator dialogGenBase, public CreateSortFilterUI(
final Context context) { @NonNull final BaseSearchFilterUiDialogGenerator dialogGenBase,
@NonNull final Context context) {
super(dialogGenBase, context, R.string.filter_search_sort_filters); super(dialogGenBase, context, R.string.filter_search_sort_filters);
} }
@ -99,7 +107,7 @@ public abstract class BaseCreateSearchFilterUI
} }
@Override @Override
public void createFilterGroupBeforeItems(final FilterGroup filterGroup) { public void createFilterGroupBeforeItems(@NonNull final FilterGroup filterGroup) {
dialogGenBase.createFilterGroup(filterGroup, dialogGenBase.createFilterGroup(filterGroup,
dialogGenBase::addSortFilterUiWrapperToItemMap, dialogGenBase::addSortFilterUiWrapperToItemMap,
dialogGenBase::selectSortFilter); dialogGenBase::selectSortFilter);

View file

@ -4,11 +4,13 @@ package org.schabi.newpipe.fragments.list.search.filter;
import org.schabi.newpipe.extractor.search.filter.FilterItem; import org.schabi.newpipe.extractor.search.filter.FilterItem;
public abstract class BaseItemWrapper implements SearchFilterLogic.IUiItemWrapper { import androidx.annotation.NonNull;
public abstract class BaseItemWrapper implements SearchFilterLogic.IUiItemWrapper {
@NonNull
protected final FilterItem item; protected final FilterItem item;
protected BaseItemWrapper(final FilterItem item) { protected BaseItemWrapper(@NonNull final FilterItem item) {
this.item = item; this.item = item;
} }

View file

@ -17,6 +17,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import icepick.Icepick; import icepick.Icepick;
@ -39,7 +40,7 @@ public abstract class BaseSearchFilterDialogFragment extends DialogFragment {
ArrayList<Integer> userSelectedSortFilterList = null; ArrayList<Integer> userSelectedSortFilterList = null;
protected static DialogFragment initDialogArguments( protected static DialogFragment initDialogArguments(
final DialogFragment dialogFragment, @NonNull final DialogFragment dialogFragment,
final int serviceId, final int serviceId,
final List<Integer> userSelectedContentFilter, final List<Integer> userSelectedContentFilter,
final List<Integer> userSelectedSortFilter) { final List<Integer> userSelectedSortFilter) {
@ -92,16 +93,17 @@ public abstract class BaseSearchFilterDialogFragment extends DialogFragment {
/** /**
* As we have different bindings we need to get this sorted in a method. * As we have different bindings we need to get this sorted in a method.
* *
* @return the {@link Toolbar} * @return the {@link Toolbar} null if there is no toolbar available.
*/ */
@Nullable
protected abstract Toolbar getToolbar(); protected abstract Toolbar getToolbar();
protected abstract View getRootView(LayoutInflater inflater, protected abstract View getRootView(@NonNull LayoutInflater inflater,
ViewGroup container); @Nullable ViewGroup container);
@Override @Override
public View onCreateView(@NonNull final LayoutInflater inflater, public View onCreateView(@NonNull final LayoutInflater inflater,
final ViewGroup container, @Nullable final ViewGroup container,
final Bundle savedInstanceState) { final Bundle savedInstanceState) {
final View rootView = getRootView(inflater, container); final View rootView = getRootView(inflater, container);
initializeFilterData(); initializeFilterData();
@ -113,10 +115,20 @@ public abstract class BaseSearchFilterDialogFragment extends DialogFragment {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
Icepick.restoreInstanceState(this, savedInstanceState); Icepick.restoreInstanceState(this, savedInstanceState);
initToolbar(getToolbar()); final Toolbar toolbar = getToolbar();
if (toolbar != null) {
initToolbar(toolbar);
}
} }
protected void initToolbar(final Toolbar toolbar) { /**
* Initialize the toolbar.
* <p>
* This method is only called if {@link #getToolbar()} is implemented to return a toolbar.
*
* @param toolbar the actual toolbar for this dialog fragment
*/
protected void initToolbar(@NonNull final Toolbar toolbar) {
toolbar.setTitle(R.string.filter); toolbar.setTitle(R.string.filter);
toolbar.setNavigationIcon(R.drawable.ic_arrow_back); toolbar.setNavigationIcon(R.drawable.ic_arrow_back);
toolbar.inflateMenu(R.menu.menu_search_filter_dialog_fragment); toolbar.inflateMenu(R.menu.menu_search_filter_dialog_fragment);

View file

@ -12,23 +12,27 @@ import org.schabi.newpipe.extractor.search.filter.FilterGroup;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import static android.util.TypedValue.COMPLEX_UNIT_DIP; import static android.util.TypedValue.COMPLEX_UNIT_DIP;
public abstract class BaseSearchFilterUiDialogGenerator extends BaseSearchFilterUiGenerator { public abstract class BaseSearchFilterUiDialogGenerator extends BaseSearchFilterUiGenerator {
private static final float FONT_SIZE_TITLE_ITEMS_IN_DIP = 20f; private static final float FONT_SIZE_TITLE_ITEMS_IN_DIP = 20f;
protected BaseSearchFilterUiDialogGenerator( protected BaseSearchFilterUiDialogGenerator(
final SearchQueryHandlerFactory linkHandlerFactory, @NonNull final SearchQueryHandlerFactory linkHandlerFactory,
final Callback callback, @Nullable final Callback callback,
final Context context) { @NonNull final Context context) {
super(linkHandlerFactory, callback, context); super(linkHandlerFactory, callback, context);
} }
protected abstract void createTitle(String name, List<View> titleViewElements); protected abstract void createTitle(@NonNull String name,
@NonNull List<View> titleViewElements);
protected abstract void createFilterGroup(FilterGroup filterGroup, protected abstract void createFilterGroup(@NonNull FilterGroup filterGroup,
UiWrapperMapDelegate wrapperDelegate, @NonNull UiWrapperMapDelegate wrapperDelegate,
UiSelectorDelegate selectorDelegate); @NonNull UiSelectorDelegate selectorDelegate);
@Override @Override
protected ICreateUiForFiltersWorker createContentFilterWorker() { protected ICreateUiForFiltersWorker createContentFilterWorker() {
@ -40,7 +44,8 @@ public abstract class BaseSearchFilterUiDialogGenerator extends BaseSearchFilter
return new BaseCreateSearchFilterUI.CreateSortFilterUI(this, context); return new BaseCreateSearchFilterUI.CreateSortFilterUI(this, context);
} }
protected View createSeparatorLine(final ViewGroup.LayoutParams layoutParams) { @NonNull
protected View createSeparatorLine(@NonNull final ViewGroup.LayoutParams layoutParams) {
final View separatorLine = new View(context); final View separatorLine = new View(context);
separatorLine.setBackgroundColor(getSeparatorLineColorFromTheme()); separatorLine.setBackgroundColor(getSeparatorLineColorFromTheme());
layoutParams.height = 1; // always set the separator to the height of 1 layoutParams.height = 1; // always set the separator to the height of 1
@ -48,8 +53,9 @@ public abstract class BaseSearchFilterUiDialogGenerator extends BaseSearchFilter
return separatorLine; return separatorLine;
} }
protected TextView createTitleText(final String name, @NonNull
final ViewGroup.LayoutParams layoutParams) { protected TextView createTitleText(@NonNull final String name,
@NonNull final ViewGroup.LayoutParams layoutParams) {
final TextView title = new TextView(context); final TextView title = new TextView(context);
title.setText(name); title.setText(name);
title.setTextSize(COMPLEX_UNIT_DIP, FONT_SIZE_TITLE_ITEMS_IN_DIP); title.setTextSize(COMPLEX_UNIT_DIP, FONT_SIZE_TITLE_ITEMS_IN_DIP);

View file

@ -2,6 +2,8 @@
package org.schabi.newpipe.fragments.list.search.filter; package org.schabi.newpipe.fragments.list.search.filter;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.util.TypedValue; import android.util.TypedValue;
@ -21,9 +23,10 @@ public abstract class BaseSearchFilterUiGenerator extends SearchFilterLogic {
protected final ICreateUiForFiltersWorker sortFilterWorker; protected final ICreateUiForFiltersWorker sortFilterWorker;
protected final Context context; protected final Context context;
protected BaseSearchFilterUiGenerator(final SearchQueryHandlerFactory linkHandlerFactory, protected BaseSearchFilterUiGenerator(
final Callback callback, @NonNull final SearchQueryHandlerFactory linkHandlerFactory,
final Context context) { @Nullable final Callback callback,
@NonNull final Context context) {
super(linkHandlerFactory, callback); super(linkHandlerFactory, callback);
this.context = context; this.context = context;
this.contentFilterWorker = createContentFilterWorker(); this.contentFilterWorker = createContentFilterWorker();

View file

@ -6,12 +6,14 @@ import android.view.View;
import org.schabi.newpipe.extractor.search.filter.FilterItem; import org.schabi.newpipe.extractor.search.filter.FilterItem;
import androidx.annotation.NonNull;
public abstract class BaseUiItemWrapper extends BaseItemWrapper { public abstract class BaseUiItemWrapper extends BaseItemWrapper {
@NonNull
protected final View view; protected final View view;
protected BaseUiItemWrapper(final FilterItem item, protected BaseUiItemWrapper(@NonNull final FilterItem item,
final View view) { @NonNull final View view) {
super(item); super(item);
this.view = view; this.view = view;
} }

View file

@ -11,6 +11,8 @@ import org.schabi.newpipe.extractor.StreamingService;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
@ -41,13 +43,14 @@ public class SearchFilterDialogFragment extends BaseSearchFilterDialogFragment {
} }
@Override @Override
@Nullable
protected Toolbar getToolbar() { protected Toolbar getToolbar() {
return binding.toolbarLayout.toolbar; return binding.toolbarLayout.toolbar;
} }
@Override @Override
protected View getRootView(final LayoutInflater inflater, protected View getRootView(@NonNull final LayoutInflater inflater,
final ViewGroup container) { @Nullable final ViewGroup container) {
binding = SearchFilterDialogFragmentBinding binding = SearchFilterDialogFragmentBinding
.inflate(inflater, container, false); .inflate(inflater, container, false);
return binding.getRoot(); return binding.getRoot();

View file

@ -23,23 +23,25 @@ import org.schabi.newpipe.util.ServiceHelper;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.view.ContextThemeWrapper; import androidx.appcompat.view.ContextThemeWrapper;
public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerator { public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerator {
private final GridLayout globalLayout; private final GridLayout globalLayout;
public SearchFilterDialogGenerator(final StreamingService service, public SearchFilterDialogGenerator(@NonNull final StreamingService service,
final ViewGroup root, @NonNull final ViewGroup root,
final Context context, @NonNull final Context context,
final SearchFilterLogic.Callback callback) { @Nullable final SearchFilterLogic.Callback callback) {
super(service.getSearchQHFactory(), callback, context); super(service.getSearchQHFactory(), callback, context);
this.globalLayout = createGridLayout(); this.globalLayout = createGridLayout();
root.addView(globalLayout); root.addView(globalLayout);
} }
@Override @Override
protected void createTitle(final String name, protected void createTitle(@NonNull final String name,
final List<View> titleViewElements) { @NonNull final List<View> titleViewElements) {
final TextView titleView = createTitleText(name); final TextView titleView = createTitleText(name);
final View separatorLine = createSeparatorLine(); final View separatorLine = createSeparatorLine();
final View separatorLine2 = createSeparatorLine(); final View separatorLine2 = createSeparatorLine();
@ -54,9 +56,9 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat
} }
@Override @Override
protected void createFilterGroup(final FilterGroup filterGroup, protected void createFilterGroup(@NonNull final FilterGroup filterGroup,
final UiWrapperMapDelegate wrapperDelegate, @NonNull final UiWrapperMapDelegate wrapperDelegate,
final UiSelectorDelegate selectorDelegate) { @NonNull final UiSelectorDelegate selectorDelegate) {
final GridLayout.LayoutParams layoutParams = getLayoutParamsViews(); final GridLayout.LayoutParams layoutParams = getLayoutParamsViews();
boolean doSpanDataOverMultipleCells = false; boolean doSpanDataOverMultipleCells = false;
final UiItemWrapperViews viewsWrapper = new UiItemWrapperViews( final UiItemWrapperViews viewsWrapper = new UiItemWrapperViews(
@ -111,10 +113,10 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat
} }
private void createUiElementsForSingleSelectableItemsFilterGroup( private void createUiElementsForSingleSelectableItemsFilterGroup(
final FilterGroup filterGroup, @NonNull final FilterGroup filterGroup,
final UiWrapperMapDelegate wrapperDelegate, @NonNull final UiWrapperMapDelegate wrapperDelegate,
final UiSelectorDelegate selectorDelegate, @NonNull final UiSelectorDelegate selectorDelegate,
final Spinner filterDataSpinner) { @NonNull final Spinner filterDataSpinner) {
filterDataSpinner.setAdapter(new SearchFilterDialogSpinnerAdapter( filterDataSpinner.setAdapter(new SearchFilterDialogSpinnerAdapter(
context, filterGroup, wrapperDelegate, filterDataSpinner)); context, filterGroup, wrapperDelegate, filterDataSpinner));
@ -138,10 +140,10 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat
} }
private void createUiElementsForMultipleSelectableItemsFilterGroup( private void createUiElementsForMultipleSelectableItemsFilterGroup(
final FilterGroup filterGroup, @NonNull final FilterGroup filterGroup,
final UiWrapperMapDelegate wrapperDelegate, @NonNull final UiWrapperMapDelegate wrapperDelegate,
final UiSelectorDelegate selectorDelegate, @NonNull final UiSelectorDelegate selectorDelegate,
final ChipGroup chipGroup) { @NonNull final ChipGroup chipGroup) {
for (final FilterItem item : filterGroup.getFilterItems()) { for (final FilterItem item : filterGroup.getFilterItems()) {
final Chip chip = new Chip(new ContextThemeWrapper( final Chip chip = new Chip(new ContextThemeWrapper(
context, R.style.Theme_MaterialComponents_Light)); context, R.style.Theme_MaterialComponents_Light));
@ -158,10 +160,12 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat
} }
} }
@NonNull
private View createSeparatorLine() { private View createSeparatorLine() {
return createSeparatorLine(clipFreeRightColumnLayoutParams(true)); return createSeparatorLine(clipFreeRightColumnLayoutParams(true));
} }
@NonNull
private TextView createTitleText(final String name) { private TextView createTitleText(final String name) {
final TextView title = createTitleText(name, final TextView title = createTitleText(name,
clipFreeRightColumnLayoutParams(true)); clipFreeRightColumnLayoutParams(true));
@ -169,6 +173,7 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat
return title; return title;
} }
@NonNull
private GridLayout createGridLayout() { private GridLayout createGridLayout() {
final GridLayout layout = new GridLayout(context); final GridLayout layout = new GridLayout(context);
@ -183,6 +188,7 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat
return layout; return layout;
} }
@NonNull
private GridLayout.LayoutParams clipFreeRightColumnLayoutParams(final boolean doColumnSpan) { private GridLayout.LayoutParams clipFreeRightColumnLayoutParams(final boolean doColumnSpan) {
final GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(); final GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
// https://stackoverflow.com/questions/37744672/gridlayout-children-are-being-clipped // https://stackoverflow.com/questions/37744672/gridlayout-children-are-being-clipped
@ -198,6 +204,7 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat
return layoutParams; return layoutParams;
} }
@NonNull
private GridLayout.LayoutParams getLayoutParamsViews() { private GridLayout.LayoutParams getLayoutParamsViews() {
final GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(); final GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
layoutParams.setGravity(Gravity.TOP); layoutParams.setGravity(Gravity.TOP);
@ -205,7 +212,9 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat
return layoutParams; return layoutParams;
} }
private GridLayout.LayoutParams setDefaultMargin(final GridLayout.LayoutParams layoutParams) { @NonNull
private GridLayout.LayoutParams setDefaultMargin(
@NonNull final GridLayout.LayoutParams layoutParams) {
layoutParams.setMargins( layoutParams.setMargins(
DeviceUtils.dpToPx(4, context), DeviceUtils.dpToPx(4, context),
DeviceUtils.dpToPx(2, context), DeviceUtils.dpToPx(2, context),
@ -215,18 +224,20 @@ public class SearchFilterDialogGenerator extends BaseSearchFilterUiDialogGenerat
return layoutParams; return layoutParams;
} }
private View setZeroPadding(final View view) { @NonNull
private View setZeroPadding(@NonNull final View view) {
view.setPadding(0, 0, 0, 0); view.setPadding(0, 0, 0, 0);
return view; return view;
} }
public static class UiItemWrapperChip extends BaseUiItemWrapper { public static class UiItemWrapperChip extends BaseUiItemWrapper {
@NonNull
private final ChipGroup chipGroup; private final ChipGroup chipGroup;
public UiItemWrapperChip(final FilterItem item, public UiItemWrapperChip(@NonNull final FilterItem item,
final View view, @NonNull final View view,
final ChipGroup chipGroup) { @NonNull final ChipGroup chipGroup) {
super(item, view); super(item, view);
this.chipGroup = chipGroup; this.chipGroup = chipGroup;
} }

View file

@ -20,6 +20,7 @@ import org.schabi.newpipe.util.ServiceHelper;
import java.util.Objects; import java.util.Objects;
import androidx.annotation.NonNull;
import androidx.collection.SparseArrayCompat; import androidx.collection.SparseArrayCompat;
public class SearchFilterDialogSpinnerAdapter extends BaseAdapter { public class SearchFilterDialogSpinnerAdapter extends BaseAdapter {
@ -33,10 +34,10 @@ public class SearchFilterDialogSpinnerAdapter extends BaseAdapter {
viewWrapperMap = new SparseArrayCompat<>(); viewWrapperMap = new SparseArrayCompat<>();
public SearchFilterDialogSpinnerAdapter( public SearchFilterDialogSpinnerAdapter(
final Context context, @NonNull final Context context,
final FilterGroup group, @NonNull final FilterGroup group,
final BaseSearchFilterUiGenerator.UiWrapperMapDelegate wrapperDelegate, @NonNull final BaseSearchFilterUiGenerator.UiWrapperMapDelegate wrapperDelegate,
final Spinner filterDataSpinner) { @NonNull final Spinner filterDataSpinner) {
this.context = context; this.context = context;
this.group = group; this.group = group;
this.wrapperDelegate = wrapperDelegate; this.wrapperDelegate = wrapperDelegate;
@ -123,6 +124,7 @@ public class SearchFilterDialogSpinnerAdapter extends BaseAdapter {
} }
} }
@NonNull
private TextView createViewItem() { private TextView createViewItem() {
final TextView view = new TextView(context); final TextView view = new TextView(context);
view.setLayoutParams(new ViewGroup.LayoutParams( view.setLayoutParams(new ViewGroup.LayoutParams(
@ -145,12 +147,13 @@ public class SearchFilterDialogSpinnerAdapter extends BaseAdapter {
public boolean isEnabled(final int position) { public boolean isEnabled(final int position) {
final UiItemWrapperSpinner wrappedView = final UiItemWrapperSpinner wrappedView =
viewWrapperMap.get(position); viewWrapperMap.get(position);
Objects.nonNull(wrappedView); Objects.requireNonNull(wrappedView);
return wrappedView.isEnabled(); return wrappedView.isEnabled();
} }
private static class UiItemWrapperSpinner private static class UiItemWrapperSpinner
extends BaseItemWrapper { extends BaseItemWrapper {
@NonNull
private final Spinner spinner; private final Spinner spinner;
/** /**
@ -165,10 +168,10 @@ public class SearchFilterDialogSpinnerAdapter extends BaseAdapter {
private int visibility; private int visibility;
private boolean enabled; private boolean enabled;
UiItemWrapperSpinner(final FilterItem item, UiItemWrapperSpinner(@NonNull final FilterItem item,
final int initialVisibility, final int initialVisibility,
final boolean isInitialEnabled, final boolean isInitialEnabled,
final Spinner spinner) { @NonNull final Spinner spinner) {
super(item); super(item);
this.spinner = spinner; this.spinner = spinner;

View file

@ -16,6 +16,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.collection.SparseArrayCompat; import androidx.collection.SparseArrayCompat;
@ -73,8 +74,8 @@ public class SearchFilterLogic {
private ICreateUiForFiltersWorker uiSortFilterWorker; private ICreateUiForFiltersWorker uiSortFilterWorker;
public SearchFilterLogic(final SearchQueryHandlerFactory searchQHFactory, public SearchFilterLogic(@NonNull final SearchQueryHandlerFactory searchQHFactory,
final Callback callback) { @Nullable final Callback callback) {
this.searchQHFactory = searchQHFactory; this.searchQHFactory = searchQHFactory;
this.callback = callback; this.callback = callback;
initContentFilters(); initContentFilters();
@ -91,8 +92,8 @@ public class SearchFilterLogic {
showSortFilterContainerUI(); showSortFilterContainerUI();
} }
private void reInitExclusiveFilterIds(final List<Integer> selectedFilters, private void reInitExclusiveFilterIds(@NonNull final List<Integer> selectedFilters,
final ExclusiveGroups exclusive) { @NonNull final ExclusiveGroups exclusive) {
checkIfIdsAreValid(selectedFilters, exclusive); checkIfIdsAreValid(selectedFilters, exclusive);
for (final int id : selectedFilters) { for (final int id : selectedFilters) {
@ -101,8 +102,9 @@ public class SearchFilterLogic {
} }
} }
public void restorePreviouslySelectedFilters(final List<Integer> selectedContentFilterList, public void restorePreviouslySelectedFilters(
final List<Integer> selectedSortFilterList) { @Nullable final List<Integer> selectedContentFilterList,
@Nullable final List<Integer> selectedSortFilterList) {
if (selectedContentFilterList != null && selectedSortFilterList != null if (selectedContentFilterList != null && selectedSortFilterList != null
&& !selectedContentFilterList.isEmpty()) { && !selectedContentFilterList.isEmpty()) {
reInitExclusiveFilterIds(selectedContentFilterList, contentFilterExclusive); reInitExclusiveFilterIds(selectedContentFilterList, contentFilterExclusive);
@ -116,8 +118,9 @@ public class SearchFilterLogic {
createSortFilterItemListFromIdentifiersList(); createSortFilterItemListFromIdentifiersList();
} }
private void reselectUiItems(final List<Integer> selectedFilters, private void reselectUiItems(
final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap) { @NonNull final List<Integer> selectedFilters,
@NonNull final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap) {
for (final int id : selectedFilters) { for (final int id : selectedFilters) {
final IUiItemWrapper iUiItemWrapper = filterIdToUiItemMap.get(id); final IUiItemWrapper iUiItemWrapper = filterIdToUiItemMap.get(id);
if (iUiItemWrapper != null) { if (iUiItemWrapper != null) {
@ -126,7 +129,8 @@ public class SearchFilterLogic {
} }
} }
private void deselectUiItems(final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap) { private void deselectUiItems(
@NonNull final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap) {
for (int index = 0; index < filterIdToUiItemMap.size(); index++) { for (int index = 0; index < filterIdToUiItemMap.size(); index++) {
final IUiItemWrapper iUiItemWrapper = filterIdToUiItemMap.valueAt(index); final IUiItemWrapper iUiItemWrapper = filterIdToUiItemMap.valueAt(index);
if (iUiItemWrapper != null) { if (iUiItemWrapper != null) {
@ -136,26 +140,31 @@ public class SearchFilterLogic {
} }
// get copy of internal list // get copy of internal list
@NonNull
public ArrayList<Integer> getSelectedContentFilters() { public ArrayList<Integer> getSelectedContentFilters() {
return new ArrayList<>(this.selectedContentFilters); return new ArrayList<>(this.selectedContentFilters);
} }
// get copy of internal list // get copy of internal list
@NonNull
public ArrayList<Integer> getSelectedSortFilters() { public ArrayList<Integer> getSelectedSortFilters() {
return new ArrayList<>(this.selectedSortFilters); return new ArrayList<>(this.selectedSortFilters);
} }
// get copy of internal list, elements are not copied // get copy of internal list, elements are not copied
@NonNull
public List<FilterItem> getSelectedContentFilterItems() { public List<FilterItem> getSelectedContentFilterItems() {
return new ArrayList<>(this.userSelectedContentFilters); return new ArrayList<>(this.userSelectedContentFilters);
} }
// get copy of internal list, elements are not copied // get copy of internal list, elements are not copied
@NonNull
public List<FilterItem> getSelectedSortFiltersItems() { public List<FilterItem> getSelectedSortFiltersItems() {
return new ArrayList<>(this.userSelectedSortFilters); return new ArrayList<>(this.userSelectedSortFilters);
} }
public void initContentFiltersUi(final ICreateUiForFiltersWorker createUiForFiltersWorker) { public void initContentFiltersUi(
@NonNull final ICreateUiForFiltersWorker createUiForFiltersWorker) {
final FilterContainer filters = searchQHFactory.getAvailableContentFilter(); final FilterContainer filters = searchQHFactory.getAvailableContentFilter();
if (filters != null && filters.getFilterGroups() != null) { if (filters != null && filters.getFilterGroups() != null) {
@ -167,7 +176,8 @@ public class SearchFilterLogic {
reselectUiItems(selectedContentFilters, contentFilterIdToUiItemMap); reselectUiItems(selectedContentFilters, contentFilterIdToUiItemMap);
} }
public void initSortFiltersUi(final ICreateUiForFiltersWorker createUiForFiltersWorker) { public void initSortFiltersUi(
@NonNull final ICreateUiForFiltersWorker createUiForFiltersWorker) {
final FilterContainer filters = searchQHFactory.getAvailableContentFilter(); final FilterContainer filters = searchQHFactory.getAvailableContentFilter();
final List<FilterGroup> sortGroups = getAllSortFilterGroups(filters); final List<FilterGroup> sortGroups = getAllSortFilterGroups(filters);
uiSortFilterWorker = createUiForFiltersWorker; uiSortFilterWorker = createUiForFiltersWorker;
@ -188,9 +198,10 @@ public class SearchFilterLogic {
* called clear() on here. * called clear() on here.
* @param createUiForFiltersWorker the implementation how to create the UI. * @param createUiForFiltersWorker the implementation how to create the UI.
*/ */
private void initFiltersUi(final FilterGroup[] filterGroups, private void initFiltersUi(
final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap, @NonNull final FilterGroup[] filterGroups,
final ICreateUiForFiltersWorker createUiForFiltersWorker) { @NonNull final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap,
@NonNull final ICreateUiForFiltersWorker createUiForFiltersWorker) {
filterIdToUiItemMap.clear(); filterIdToUiItemMap.clear();
Objects.requireNonNull(createUiForFiltersWorker); Objects.requireNonNull(createUiForFiltersWorker);
@ -221,9 +232,9 @@ public class SearchFilterLogic {
* @param fidToSupersetSortFilterMap null possible, only for content filters relevant * @param fidToSupersetSortFilterMap null possible, only for content filters relevant
*/ */
private void initFilters( private void initFilters(
final FilterGroup[] filterGroups, @NonNull final FilterGroup[] filterGroups,
final ExclusiveGroups exclusive, @NonNull final ExclusiveGroups exclusive,
final List<Integer> selectedFilters, @NonNull final List<Integer> selectedFilters,
@Nullable final SparseArrayCompat<FilterContainer> fidToSupersetSortFilterMap) { @Nullable final SparseArrayCompat<FilterContainer> fidToSupersetSortFilterMap) {
selectedFilters.clear(); selectedFilters.clear();
exclusive.clear(); exclusive.clear();
@ -253,8 +264,8 @@ public class SearchFilterLogic {
checkIfIdsAreValid(selectedFilters, exclusive); checkIfIdsAreValid(selectedFilters, exclusive);
} }
private void checkIfIdsAreValid(final List<Integer> selectedFilters, private void checkIfIdsAreValid(@NonNull final List<Integer> selectedFilters,
final ExclusiveGroups exclusive) { @NonNull final ExclusiveGroups exclusive) {
for (final int id : selectedFilters) { for (final int id : selectedFilters) {
if (!exclusive.filterIdToGroupIdMapContainsId(id)) { if (!exclusive.filterIdToGroupIdMapContainsId(id)) {
throw new RuntimeException("The id " + id + " is invalid"); throw new RuntimeException("The id " + id + " is invalid");
@ -334,7 +345,7 @@ public class SearchFilterLogic {
* *
* @param contentFilterIds content filter ids list * @param contentFilterIds content filter ids list
*/ */
private void showSortFilterIdsContainerUI(final List<Integer> contentFilterIds) { private void showSortFilterIdsContainerUI(@NonNull final List<Integer> contentFilterIds) {
for (final int contentFilterId : contentFilterIds) { for (final int contentFilterId : contentFilterIds) {
showSortFilterIdContainerUI(contentFilterId); showSortFilterIdContainerUI(contentFilterId);
} }
@ -397,9 +408,10 @@ public class SearchFilterLogic {
} }
} }
private void setUiItemsVisibility(final FilterContainer filters, private void setUiItemsVisibility(
@Nullable final FilterContainer filters,
final boolean isVisible, final boolean isVisible,
final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap) { @NonNull final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap) {
if (filters != null && filters.getFilterGroups() != null) { if (filters != null && filters.getFilterGroups() != null) {
for (final FilterGroup filterGroup : filters.getFilterGroups()) { for (final FilterGroup filterGroup : filters.getFilterGroups()) {
setUiItemVisible(isVisible, filterIdToUiItemMap, filterGroup.getIdentifier()); setUiItemVisible(isVisible, filterIdToUiItemMap, filterGroup.getIdentifier());
@ -410,8 +422,9 @@ public class SearchFilterLogic {
} }
} }
private void setUiItemVisible(final boolean isVisible, private void setUiItemVisible(
final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap, final boolean isVisible,
@NonNull final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap,
final int id) { final int id) {
final IUiItemWrapper uiWrapper = filterIdToUiItemMap.get(id); final IUiItemWrapper uiWrapper = filterIdToUiItemMap.get(id);
if (uiWrapper != null) { if (uiWrapper != null) {
@ -427,7 +440,8 @@ public class SearchFilterLogic {
* @return the sort filter groups. Empty list if either param filters or no * @return the sort filter groups. Empty list if either param filters or no
* filter groups available * filter groups available
*/ */
private List<FilterGroup> getAllSortFilterGroups(final FilterContainer filters) { @NonNull
private List<FilterGroup> getAllSortFilterGroups(@Nullable final FilterContainer filters) {
if (filters != null && filters.getFilterGroups() != null) { if (filters != null && filters.getFilterGroups() != null) {
final List<FilterGroup> sortGroups = new ArrayList<>(); final List<FilterGroup> sortGroups = new ArrayList<>();
for (final FilterGroup filterGroup : filters.getFilterGroups()) { for (final FilterGroup filterGroup : filters.getFilterGroups()) {
@ -442,8 +456,8 @@ public class SearchFilterLogic {
} }
protected void handleIdInNonExclusiveGroup(final int filterId, protected void handleIdInNonExclusiveGroup(final int filterId,
final IUiItemWrapper uiItemWrapper, @Nullable final IUiItemWrapper uiItemWrapper,
final List<Integer> selectedFilter) { @NonNull final List<Integer> selectedFilter) {
if (uiItemWrapper != null) { // could be null if there is no UI if (uiItemWrapper != null) { // could be null if there is no UI
if (uiItemWrapper.isChecked()) { if (uiItemWrapper.isChecked()) {
if (!selectedFilter.contains(filterId)) { if (!selectedFilter.contains(filterId)) {
@ -473,10 +487,11 @@ public class SearchFilterLogic {
selectFilter(filterId, sortFilterIdToUiItemMap, selectedSortFilters, sortFilterExclusive); selectFilter(filterId, sortFilterIdToUiItemMap, selectedSortFilters, sortFilterExclusive);
} }
private void selectFilter(final int id, private void selectFilter(
final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap, final int id,
final List<Integer> selectedFilter, @NonNull final SparseArrayCompat<IUiItemWrapper> filterIdToUiItemMap,
final ExclusiveGroups exclusive) { @NonNull final List<Integer> selectedFilter,
@NonNull final ExclusiveGroups exclusive) {
final IUiItemWrapper uiItemWrapper = final IUiItemWrapper uiItemWrapper =
filterIdToUiItemMap.get(id); filterIdToUiItemMap.get(id);
@ -518,8 +533,9 @@ public class SearchFilterLogic {
* @param id the id of a content filter * @param id the id of a content filter
* @param uiItemWrapper the wrapped UI {@link android.view.View} for that content filter * @param uiItemWrapper the wrapped UI {@link android.view.View} for that content filter
*/ */
protected void addContentFilterUiWrapperToItemMap(final int id, protected void addContentFilterUiWrapperToItemMap(
final IUiItemWrapper uiItemWrapper) { final int id,
@NonNull final IUiItemWrapper uiItemWrapper) {
contentFilterIdToUiItemMap.put(id, uiItemWrapper); contentFilterIdToUiItemMap.put(id, uiItemWrapper);
} }
@ -533,8 +549,9 @@ public class SearchFilterLogic {
* @param id the id of a sort filter * @param id the id of a sort filter
* @param uiItemWrapper the wrapped UI {@link android.view.View} for that sort filter * @param uiItemWrapper the wrapped UI {@link android.view.View} for that sort filter
*/ */
protected void addSortFilterUiWrapperToItemMap(final int id, protected void addSortFilterUiWrapperToItemMap(
final IUiItemWrapper uiItemWrapper) { final int id,
@NonNull final IUiItemWrapper uiItemWrapper) {
sortFilterIdToUiItemMap.put(id, uiItemWrapper); sortFilterIdToUiItemMap.put(id, uiItemWrapper);
} }
@ -591,7 +608,7 @@ public class SearchFilterLogic {
* *
* @param filterGroup one group each time from {@link FilterContainer#getFilterGroups()} * @param filterGroup one group each time from {@link FilterContainer#getFilterGroups()}
*/ */
void createFilterGroupBeforeItems(FilterGroup filterGroup); void createFilterGroupBeforeItems(@NonNull FilterGroup filterGroup);
/** /**
* Create Ui elements specifically related to a {@link FilterItem} itself. * Create Ui elements specifically related to a {@link FilterItem} itself.
@ -600,7 +617,7 @@ public class SearchFilterLogic {
* @param filterGroup (optional) one group each time from * @param filterGroup (optional) one group each time from
* {@link FilterContainer#getFilterGroups()} * {@link FilterContainer#getFilterGroups()}
*/ */
void createFilterItem(FilterItem filterItem, FilterGroup filterGroup); void createFilterItem(@NonNull FilterItem filterItem, @NonNull FilterGroup filterGroup);
/** /**
* Create Ui elements specifically related to the {@link FilterGroup} itself. * Create Ui elements specifically related to the {@link FilterGroup} itself.
@ -610,7 +627,7 @@ public class SearchFilterLogic {
* *
* @param filterGroup one group each time from {@link FilterContainer#getFilterGroups()} * @param filterGroup one group each time from {@link FilterContainer#getFilterGroups()}
*/ */
void createFilterGroupAfterItems(FilterGroup filterGroup); void createFilterGroupAfterItems(@NonNull FilterGroup filterGroup);
/** /**
* do anything you might want to clean up or whatever. * do anything you might want to clean up or whatever.
@ -629,8 +646,8 @@ public class SearchFilterLogic {
* This callback will be called if a search with additional filters should occur. * This callback will be called if a search with additional filters should occur.
*/ */
public interface Callback { public interface Callback {
void selectedFilters(List<FilterItem> userSelectedContentFilter, void selectedFilters(@NonNull List<FilterItem> userSelectedContentFilter,
List<FilterItem> userSelectedSortFilter); @NonNull List<FilterItem> userSelectedSortFilter);
} }
/** /**
@ -676,7 +693,8 @@ public class SearchFilterLogic {
public boolean isFilterIdPartOfAnExclusiveGroup(final int filterId) { public boolean isFilterIdPartOfAnExclusiveGroup(final int filterId) {
if (filterIdToGroupIdMapContainsId(filterId)) { if (filterIdToGroupIdMapContainsId(filterId)) {
final int filterGroupId = filterIdToGroupIdMap.get(filterId); final int filterGroupId =
Objects.requireNonNull(filterIdToGroupIdMap.get(filterId));
return exclusiveGroupsIdSet.contains(filterGroupId); return exclusiveGroupsIdSet.contains(filterGroupId);
} }
return false; return false;
@ -688,7 +706,7 @@ public class SearchFilterLogic {
* @return true if exclusive group * @return true if exclusive group
*/ */
private boolean handleIdInExclusiveGroup(final int filterId, private boolean handleIdInExclusiveGroup(final int filterId,
final List<Integer> selectedFilter) { @NonNull final List<Integer> selectedFilter) {
// case exclusive group selection // case exclusive group selection
if (isFilterIdPartOfAnExclusiveGroup(filterId)) { if (isFilterIdPartOfAnExclusiveGroup(filterId)) {
final int previousSelectedId = final int previousSelectedId =
@ -729,7 +747,8 @@ public class SearchFilterLogic {
} }
private void addIdIfBelongsToExclusiveGroup(final int filterId) { private void addIdIfBelongsToExclusiveGroup(final int filterId) {
final int filterGroupId = filterIdToGroupIdMap.get(filterId); final int filterGroupId =
Objects.requireNonNull(filterIdToGroupIdMap.get(filterId));
if (exclusiveGroupsIdSet.contains(filterGroupId)) { if (exclusiveGroupsIdSet.contains(filterGroupId)) {
actualSelectedFilterIdInExclusiveGroupMap.put(filterGroupId, filterId); actualSelectedFilterIdInExclusiveGroupMap.put(filterGroupId, filterId);
} }
@ -747,7 +766,8 @@ public class SearchFilterLogic {
private int ifInExclusiveGroupRemovePreviouslySelectedId(final int filterId) { private int ifInExclusiveGroupRemovePreviouslySelectedId(final int filterId) {
int previousFilterId = ITEM_IDENTIFIER_UNKNOWN; int previousFilterId = ITEM_IDENTIFIER_UNKNOWN;
final int filterGroupId = filterIdToGroupIdMap.get(filterId); final int filterGroupId =
Objects.requireNonNull(filterIdToGroupIdMap.get(filterId));
final int index = actualSelectedFilterIdInExclusiveGroupMap.indexOfKey(filterGroupId); final int index = actualSelectedFilterIdInExclusiveGroupMap.indexOfKey(filterGroupId);
if (exclusiveGroupsIdSet.contains(filterGroupId) && index >= 0) { if (exclusiveGroupsIdSet.contains(filterGroupId) && index >= 0) {

View file

@ -17,6 +17,7 @@ import org.schabi.newpipe.extractor.StreamingService;
import java.util.ArrayList; import java.util.ArrayList;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
@ -27,10 +28,11 @@ public class SearchFilterOptionMenuAlikeDialogFragment extends BaseSearchFilterD
private SearchFilterOptionMenuAlikeDialogFragmentBinding binding; private SearchFilterOptionMenuAlikeDialogFragmentBinding binding;
@NonNull
public static DialogFragment newInstance( public static DialogFragment newInstance(
final int serviceId, final int serviceId,
final ArrayList<Integer> userSelectedContentFilter, @Nullable final ArrayList<Integer> userSelectedContentFilter,
final ArrayList<Integer> userSelectedSortFilter) { @Nullable final ArrayList<Integer> userSelectedSortFilter) {
return initDialogArguments( return initDialogArguments(
new SearchFilterOptionMenuAlikeDialogFragment(), new SearchFilterOptionMenuAlikeDialogFragment(),
serviceId, serviceId,
@ -47,12 +49,13 @@ public class SearchFilterOptionMenuAlikeDialogFragment extends BaseSearchFilterD
} }
@Override @Override
@Nullable
protected Toolbar getToolbar() { protected Toolbar getToolbar() {
return binding.toolbarLayout.toolbar; return binding.toolbarLayout.toolbar;
} }
@Override @Override
protected View getRootView(final LayoutInflater inflater, protected View getRootView(@NonNull final LayoutInflater inflater,
final ViewGroup container) { final ViewGroup container) {
binding = SearchFilterOptionMenuAlikeDialogFragmentBinding binding = SearchFilterOptionMenuAlikeDialogFragmentBinding
.inflate(inflater, container, false); .inflate(inflater, container, false);
@ -83,7 +86,8 @@ public class SearchFilterOptionMenuAlikeDialogFragment extends BaseSearchFilterD
} }
} }
protected void initToolbar(final Toolbar toolbar) { @Override
protected void initToolbar(final @NonNull Toolbar toolbar) {
super.initToolbar(toolbar); super.initToolbar(toolbar);
// no room for a title // no room for a title
toolbar.setTitle(""); toolbar.setTitle("");

View file

@ -21,6 +21,7 @@ import org.schabi.newpipe.util.ServiceHelper;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import static android.util.TypedValue.COMPLEX_UNIT_DIP; import static android.util.TypedValue.COMPLEX_UNIT_DIP;
@ -30,10 +31,10 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
private static final int VIEW_ITEMS_MIN_WIDTH_IN_DIP = 168; private static final int VIEW_ITEMS_MIN_WIDTH_IN_DIP = 168;
private final LinearLayout globalLayout; private final LinearLayout globalLayout;
public SearchFilterOptionMenuAlikeDialogGenerator(final StreamingService service, public SearchFilterOptionMenuAlikeDialogGenerator(@NonNull final StreamingService service,
final ViewGroup root, @NonNull final ViewGroup root,
final Context context, @NonNull final Context context,
final Callback callback) { @Nullable final Callback callback) {
super(service.getSearchQHFactory(), callback, context); super(service.getSearchQHFactory(), callback, context);
this.globalLayout = createLinearLayout(); this.globalLayout = createLinearLayout();
root.addView(globalLayout); root.addView(globalLayout);
@ -85,8 +86,8 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
} }
@Override @Override
protected void createTitle(final String name, protected void createTitle(@NonNull final String name,
final List<View> titleViewElements) { @NonNull final List<View> titleViewElements) {
final TextView titleView = createTitleText(name); final TextView titleView = createTitleText(name);
titleView.setTag(NO_RESIZE_VIEW_TAG); titleView.setTag(NO_RESIZE_VIEW_TAG);
final View separatorLine = createSeparatorLine(); final View separatorLine = createSeparatorLine();
@ -105,9 +106,9 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
} }
@Override @Override
protected void createFilterGroup(final FilterGroup filterGroup, protected void createFilterGroup(@NonNull final FilterGroup filterGroup,
final UiWrapperMapDelegate wrapperDelegate, @NonNull final UiWrapperMapDelegate wrapperDelegate,
final UiSelectorDelegate selectorDelegate) { @NonNull final UiSelectorDelegate selectorDelegate) {
final UiItemWrapperViews viewsWrapper = new UiItemWrapperViews( final UiItemWrapperViews viewsWrapper = new UiItemWrapperViews(
filterGroup.getIdentifier()); filterGroup.getIdentifier());
@ -142,10 +143,10 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
} }
private void createUiElementsForSingleSelectableItemsFilterGroup( private void createUiElementsForSingleSelectableItemsFilterGroup(
final FilterGroup filterGroup, @NonNull final FilterGroup filterGroup,
final UiWrapperMapDelegate wrapperDelegate, @NonNull final UiWrapperMapDelegate wrapperDelegate,
final UiSelectorDelegate selectorDelegate, @NonNull final UiSelectorDelegate selectorDelegate,
final RadioGroup radioGroup) { @NonNull final RadioGroup radioGroup) {
for (final FilterItem item : filterGroup.getFilterItems()) { for (final FilterItem item : filterGroup.getFilterItems()) {
final View view; final View view;
@ -170,9 +171,9 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
} }
private void createUiElementsForMultipleSelectableItemsFilterGroup( private void createUiElementsForMultipleSelectableItemsFilterGroup(
final FilterGroup filterGroup, @NonNull final FilterGroup filterGroup,
final UiWrapperMapDelegate wrapperDelegate, @NonNull final UiWrapperMapDelegate wrapperDelegate,
final UiSelectorDelegate selectorDelegate) { @NonNull final UiSelectorDelegate selectorDelegate) {
for (final FilterItem item : filterGroup.getFilterItems()) { for (final FilterItem item : filterGroup.getFilterItems()) {
final View view; final View view;
if (item instanceof FilterItem.DividerItem) { if (item instanceof FilterItem.DividerItem) {
@ -197,6 +198,7 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
} }
} }
@NonNull
private LinearLayout createLinearLayout() { private LinearLayout createLinearLayout() {
final LinearLayout linearLayout = new LinearLayout(context); final LinearLayout linearLayout = new LinearLayout(context);
@ -215,6 +217,7 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
return linearLayout; return linearLayout;
} }
@NonNull
private LinearLayout.LayoutParams getLayoutForSeparatorLine() { private LinearLayout.LayoutParams getLayoutForSeparatorLine() {
final LinearLayout.LayoutParams layoutParams = getLayoutParamsLabelLeft(); final LinearLayout.LayoutParams layoutParams = getLayoutParamsLabelLeft();
layoutParams.width = 0; layoutParams.width = 0;
@ -222,10 +225,12 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
return layoutParams; return layoutParams;
} }
@NonNull
private View createSeparatorLine() { private View createSeparatorLine() {
return createSeparatorLine(getLayoutForSeparatorLine()); return createSeparatorLine(getLayoutForSeparatorLine());
} }
@NonNull
private TextView createTitleText(final String name) { private TextView createTitleText(final String name) {
final LinearLayout.LayoutParams layoutParams = getLayoutParamsLabelLeft(); final LinearLayout.LayoutParams layoutParams = getLayoutParamsLabelLeft();
layoutParams.gravity = Gravity.CENTER_HORIZONTAL; layoutParams.gravity = Gravity.CENTER_HORIZONTAL;
@ -234,7 +239,8 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
return title; return title;
} }
private View setPadding(final View view, final int sizeInDip) { @NonNull
private View setPadding(@NonNull final View view, final int sizeInDip) {
final int sizeInPx = DeviceUtils.dpToPx(sizeInDip, context); final int sizeInPx = DeviceUtils.dpToPx(sizeInDip, context);
view.setPadding( view.setPadding(
sizeInPx, sizeInPx,
@ -244,8 +250,9 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
return view; return view;
} }
private TextView createFilterGroupLabel(final FilterGroup filterGroup, @NonNull
final ViewGroup.LayoutParams layoutParams) { private TextView createFilterGroupLabel(@NonNull final FilterGroup filterGroup,
@NonNull final ViewGroup.LayoutParams layoutParams) {
final TextView filterLabel = new TextView(context); final TextView filterLabel = new TextView(context);
filterLabel.setId(filterGroup.getIdentifier()); filterLabel.setId(filterGroup.getIdentifier());
filterLabel.setText(ServiceHelper filterLabel.setText(ServiceHelper
@ -257,8 +264,9 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
return filterLabel; return filterLabel;
} }
private CheckBox createCheckBox(final FilterItem item, @NonNull
final ViewGroup.LayoutParams layoutParams) { private CheckBox createCheckBox(@NonNull final FilterItem item,
@NonNull final ViewGroup.LayoutParams layoutParams) {
final CheckBox checkBox = new CheckBox(context); final CheckBox checkBox = new CheckBox(context);
checkBox.setLayoutParams(layoutParams); checkBox.setLayoutParams(layoutParams);
checkBox.setText(ServiceHelper.getTranslatedFilterString( checkBox.setText(ServiceHelper.getTranslatedFilterString(
@ -268,8 +276,9 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
return checkBox; return checkBox;
} }
private TextView createDividerTextView(final FilterItem item, @NonNull
final ViewGroup.LayoutParams layoutParams) { private TextView createDividerTextView(@NonNull final FilterItem item,
@NonNull final ViewGroup.LayoutParams layoutParams) {
final TextView view = new TextView(context); final TextView view = new TextView(context);
view.setEnabled(true); view.setEnabled(true);
final String menuDividerTitle = final String menuDividerTitle =
@ -280,8 +289,9 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
return view; return view;
} }
private RadioButton createViewItemRadio(final FilterItem item, @NonNull
final ViewGroup.LayoutParams layoutParams) { private RadioButton createViewItemRadio(@NonNull final FilterItem item,
@NonNull final ViewGroup.LayoutParams layoutParams) {
final RadioButton view = new RadioButton(context); final RadioButton view = new RadioButton(context);
view.setId(item.getIdentifier()); view.setId(item.getIdentifier());
view.setText(ServiceHelper.getTranslatedFilterString(item.getNameId(), context)); view.setText(ServiceHelper.getTranslatedFilterString(item.getNameId(), context));
@ -319,11 +329,12 @@ public class SearchFilterOptionMenuAlikeDialogGenerator extends BaseSearchFilter
private static final class UiItemWrapperCheckBoxAndRadioButton private static final class UiItemWrapperCheckBoxAndRadioButton
extends BaseUiItemWrapper { extends BaseUiItemWrapper {
@Nullable
private final View group; private final View group;
private UiItemWrapperCheckBoxAndRadioButton(final FilterItem item, private UiItemWrapperCheckBoxAndRadioButton(@NonNull final FilterItem item,
final View view, @NonNull final View view,
final View group) { @Nullable final View group) {
super(item, view); super(item, view);
this.group = group; this.group = group;
} }

View file

@ -19,8 +19,10 @@ import org.schabi.newpipe.util.ServiceHelper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.view.menu.MenuBuilder; import androidx.appcompat.view.menu.MenuBuilder;
import androidx.core.view.MenuCompat; import androidx.core.view.MenuCompat;
@ -41,9 +43,9 @@ public class SearchFilterUIOptionMenu extends BaseSearchFilterUiGenerator {
private int newLastUsedGroupId = MENU_GROUP_SEARCH_RESET_BUTTONS + 1; private int newLastUsedGroupId = MENU_GROUP_SEARCH_RESET_BUTTONS + 1;
private int firstSortFilterGroupId; private int firstSortFilterGroupId;
public SearchFilterUIOptionMenu(final StreamingService service, public SearchFilterUIOptionMenu(@NonNull final StreamingService service,
final Callback callback, @Nullable final Callback callback,
final Context context) { @NonNull final Context context) {
super(service.getSearchQHFactory(), callback, context); super(service.getSearchQHFactory(), callback, context);
} }
@ -53,8 +55,10 @@ public class SearchFilterUIOptionMenu extends BaseSearchFilterUiGenerator {
@Override @Override
protected void handleIdInNonExclusiveGroup(final int filterId, protected void handleIdInNonExclusiveGroup(final int filterId,
final IUiItemWrapper uiItemWrapper, @Nullable final IUiItemWrapper uiItemWrapper,
final List<Integer> selectedFilter) { @NonNull final List<Integer> selectedFilter) {
// here it should never be null as the UI is the action menu
Objects.requireNonNull(uiItemWrapper);
uiItemWrapper.setChecked(!uiItemWrapper.isChecked()); // toggle uiItemWrapper.setChecked(!uiItemWrapper.isChecked()); // toggle
super.handleIdInNonExclusiveGroup(filterId, uiItemWrapper, selectedFilter); super.handleIdInNonExclusiveGroup(filterId, uiItemWrapper, selectedFilter);
} }
@ -206,7 +210,7 @@ public class SearchFilterUIOptionMenu extends BaseSearchFilterUiGenerator {
@Override @Override
public void createFilterGroupBeforeItems( public void createFilterGroupBeforeItems(
final FilterGroup filterGroup) { @NonNull final FilterGroup filterGroup) {
if (filterGroup.getNameId() != null) { if (filterGroup.getNameId() != null) {
createNotEnabledAndUncheckableGroupTitleMenuItem( createNotEnabledAndUncheckableGroupTitleMenuItem(
FilterContainer.ITEM_IDENTIFIER_UNKNOWN, filterGroup.getNameId()); FilterContainer.ITEM_IDENTIFIER_UNKNOWN, filterGroup.getNameId());
@ -230,8 +234,8 @@ public class SearchFilterUIOptionMenu extends BaseSearchFilterUiGenerator {
} }
@Override @Override
public void createFilterItem(final FilterItem filterItem, public void createFilterItem(@NonNull final FilterItem filterItem,
final FilterGroup filterGroup) { @NonNull final FilterGroup filterGroup) {
final MenuItem item = createMenuItem(filterItem); final MenuItem item = createMenuItem(filterItem);
if (filterItem instanceof FilterItem.DividerItem) { if (filterItem instanceof FilterItem.DividerItem) {
@ -255,7 +259,7 @@ public class SearchFilterUIOptionMenu extends BaseSearchFilterUiGenerator {
} }
@Override @Override
public void createFilterGroupAfterItems(final FilterGroup filterGroup) { public void createFilterGroupAfterItems(@NonNull final FilterGroup filterGroup) {
makeAllowedMenuItemInGroupCheckable(filterGroup.isOnlyOneCheckable(), makeAllowedMenuItemInGroupCheckable(filterGroup.isOnlyOneCheckable(),
getLastUsedGroupIdThanIncrement()); getLastUsedGroupIdThanIncrement());
} }
@ -285,7 +289,7 @@ public class SearchFilterUIOptionMenu extends BaseSearchFilterUiGenerator {
@Override @Override
public void createFilterGroupBeforeItems( public void createFilterGroupBeforeItems(
final FilterGroup filterGroup) { @NonNull final FilterGroup filterGroup) {
if (filterGroup.getNameId() != null) { if (filterGroup.getNameId() != null) {
final MenuItem item = createNotEnabledAndUncheckableGroupTitleMenuItem( final MenuItem item = createNotEnabledAndUncheckableGroupTitleMenuItem(
filterGroup.getIdentifier(), filterGroup.getNameId()); filterGroup.getIdentifier(), filterGroup.getNameId());
@ -294,8 +298,8 @@ public class SearchFilterUIOptionMenu extends BaseSearchFilterUiGenerator {
} }
@Override @Override
public void createFilterItem(final FilterItem filterItem, public void createFilterItem(@NonNull final FilterItem filterItem,
final FilterGroup filterGroup) { @NonNull final FilterGroup filterGroup) {
final MenuItem item = createMenuItem(filterItem); final MenuItem item = createMenuItem(filterItem);
addSortFilterUiToItemMap(filterItem.getIdentifier(), item); addSortFilterUiToItemMap(filterItem.getIdentifier(), item);
} }

View file

@ -7,6 +7,8 @@ import android.view.View;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import androidx.annotation.NonNull;
/** /**
* Wrapper for views that are either just labels or eg. a RadioGroup container * Wrapper for views that are either just labels or eg. a RadioGroup container
* etc. that represent a {@link org.schabi.newpipe.extractor.search.filter.FilterGroup}. * etc. that represent a {@link org.schabi.newpipe.extractor.search.filter.FilterGroup}.
@ -20,7 +22,7 @@ final class UiItemWrapperViews implements SearchFilterLogic.IUiItemWrapper {
this.itemId = itemId; this.itemId = itemId;
} }
public void add(final View view) { public void add(@NonNull final View view) {
this.views.add(view); this.views.add(view);
} }

View file

@ -23,6 +23,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import androidx.annotation.NonNull;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@ -140,8 +142,8 @@ public class SearchFilterLogicAndUiGeneratorTest {
public void contentFilterItemsIdsMatchIdsAndCallbackTest() throws ExtractionException { public void contentFilterItemsIdsMatchIdsAndCallbackTest() throws ExtractionException {
setupEach(false, new SearchFilterLogic.Callback() { setupEach(false, new SearchFilterLogic.Callback() {
@Override @Override
public void selectedFilters(final List<FilterItem> userSelectedContentFilter, public void selectedFilters(@NonNull final List<FilterItem> userSelectedContentFilter,
final List<FilterItem> userSelectedSortFilter) { @NonNull final List<FilterItem> userSelectedSortFilter) {
fromCallbackContentFilterItems = userSelectedContentFilter; fromCallbackContentFilterItems = userSelectedContentFilter;
fromCallbackSortFilterItems = userSelectedSortFilter; fromCallbackSortFilterItems = userSelectedSortFilter;
} }
@ -497,7 +499,7 @@ public class SearchFilterLogicAndUiGeneratorTest {
} }
@Override @Override
public void createFilterGroupBeforeItems(final FilterGroup filterGroup) { public void createFilterGroupBeforeItems(@NonNull final FilterGroup filterGroup) {
for (final FilterItem item : filterGroup.getFilterItems()) { for (final FilterItem item : filterGroup.getFilterItems()) {
final ElementsWrapper element = final ElementsWrapper element =
new ElementsWrapper(item, filterGroup.getIdentifier()); new ElementsWrapper(item, filterGroup.getIdentifier());
@ -511,12 +513,12 @@ public class SearchFilterLogicAndUiGeneratorTest {
} }
@Override @Override
public void createFilterItem(final FilterItem filterItem, public void createFilterItem(@NonNull final FilterItem filterItem,
final FilterGroup filterGroup) { @NonNull final FilterGroup filterGroup) {
} }
@Override @Override
public void createFilterGroupAfterItems(final FilterGroup filterGroup) { public void createFilterGroupAfterItems(@NonNull final FilterGroup filterGroup) {
} }
@Override @Override