Skip to content

Commit 717c102

Browse files
committed
searchfilters: convert SearchFragment using the ViewModel (part 2 of 3)
1 parent 0953a01 commit 717c102

1 file changed

Lines changed: 43 additions & 46 deletions

File tree

app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java

Lines changed: 43 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import androidx.core.text.HtmlCompat;
3636
import androidx.fragment.app.DialogFragment;
3737
import androidx.fragment.app.FragmentManager;
38+
import androidx.lifecycle.ViewModelProvider;
3839
import androidx.preference.PreferenceManager;
3940
import androidx.recyclerview.widget.ItemTouchHelper;
4041
import androidx.recyclerview.widget.RecyclerView;
@@ -43,7 +44,6 @@
4344
import org.schabi.newpipe.R;
4445
import org.schabi.newpipe.databinding.FragmentSearchBinding;
4546
import org.schabi.newpipe.error.ErrorInfo;
46-
import org.schabi.newpipe.error.ErrorUtil;
4747
import org.schabi.newpipe.error.ReCaptchaActivity;
4848
import org.schabi.newpipe.error.UserAction;
4949
import org.schabi.newpipe.extractor.InfoItem;
@@ -52,13 +52,11 @@
5252
import org.schabi.newpipe.extractor.NewPipe;
5353
import org.schabi.newpipe.extractor.Page;
5454
import org.schabi.newpipe.extractor.StreamingService;
55-
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
5655
import org.schabi.newpipe.extractor.search.SearchExtractor;
5756
import org.schabi.newpipe.extractor.search.SearchInfo;
5857
import org.schabi.newpipe.extractor.search.filter.FilterItem;
5958
import org.schabi.newpipe.fragments.BackPressable;
6059
import org.schabi.newpipe.fragments.list.BaseListFragment;
61-
import org.schabi.newpipe.fragments.list.search.filter.BaseSearchFilterDialogFragment;
6260
import org.schabi.newpipe.fragments.list.search.filter.SearchFilterDialogFragment;
6361
import org.schabi.newpipe.fragments.list.search.filter.SearchFilterLogic;
6462
import org.schabi.newpipe.fragments.list.search.filter.SearchFilterOptionMenuAlikeDialogFragment;
@@ -90,8 +88,7 @@
9088
import io.reactivex.rxjava3.subjects.PublishSubject;
9189

9290
public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.InfoItemsPage<?>>
93-
implements BackPressable, SearchFilterLogic.Callback,
94-
BaseSearchFilterDialogFragment.Listener {
91+
implements BackPressable {
9592
/*//////////////////////////////////////////////////////////////////////////
9693
// Search
9794
//////////////////////////////////////////////////////////////////////////*/
@@ -169,6 +166,11 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
169166
@State
170167
ArrayList<Integer> userSelectedSortFilterList = null;
171168

169+
protected SearchViewModel searchViewModel;
170+
protected SearchFilterLogic.Factory.Variant logicVariant =
171+
SearchFilterLogic.Factory.Variant.SEARCH_FILTER_LOGIC_DEFAULT;
172+
173+
172174
public static SearchFragment getInstance(final int serviceId, final String searchString) {
173175
final SearchFragment searchFragment;
174176
final App app = App.getApp();
@@ -227,30 +229,40 @@ public View onCreateView(@NonNull final LayoutInflater inflater,
227229
if (userSelectedSortFilterList == null) {
228230
userSelectedSortFilterList = new ArrayList<>();
229231
}
230-
initializeFilterData();
232+
233+
initViewModel();
234+
235+
// observe the content/sort filter items lists
236+
searchViewModel.getSelectedContentFilterItemListLiveData().observe(
237+
getViewLifecycleOwner(), filterItems -> selectedContentFilter = filterItems);
238+
searchViewModel.getSelectedSortFilterItemListLiveData().observe(
239+
getViewLifecycleOwner(), filterItems -> selectedSortFilter = filterItems);
240+
241+
// the content/sort filters ids lists are only
242+
// observed here to store them via Icepick
243+
searchViewModel.getUserSelectedContentFilterListLiveData().observe(
244+
getViewLifecycleOwner(), filterIds -> userSelectedContentFilterList = filterIds);
245+
searchViewModel.getUserSelectedSortFilterListLiveData().observe(
246+
getViewLifecycleOwner(), filterIds -> userSelectedSortFilterList = filterIds);
247+
248+
searchViewModel.getDoSearchLiveData().observe(
249+
getViewLifecycleOwner(), doSearch -> {
250+
if (doSearch) {
251+
selectedFilters(selectedContentFilter, selectedSortFilter);
252+
searchViewModel.weConsumedDoSearchLiveData();
253+
}
254+
});
255+
231256
return inflater.inflate(R.layout.fragment_search, container, false);
232257
}
233258

234-
/**
235-
* initialize the initial content and sort filter Lists with defaults
236-
* or previously with Icepick stored data.
237-
*/
238-
protected void initializeFilterData() {
239-
try {
240-
final SearchFilterLogic logic =
241-
new SearchFilterLogic(NewPipe.getService(serviceId).getSearchQHFactory(), null);
242-
logic.restorePreviouslySelectedFilters(
243-
userSelectedContentFilterList,
244-
userSelectedSortFilterList);
245-
246-
userSelectedContentFilterList = logic.getSelectedContentFilters();
247-
userSelectedSortFilterList = logic.getSelectedSortFilters();
248-
selectedContentFilter = logic.getSelectedContentFilterItems();
249-
selectedSortFilter = logic.getSelectedSortFiltersItems();
250-
} catch (final ExtractionException e) {
251-
ErrorUtil.showUiErrorSnackbar(this,
252-
"No filtering possible. Getting service for id " + serviceId, e);
253-
}
259+
protected void initViewModel() {
260+
searchViewModel = new ViewModelProvider(this, SearchViewModel.Companion
261+
.getFactory(serviceId,
262+
logicVariant,
263+
userSelectedContentFilterList,
264+
userSelectedSortFilterList))
265+
.get(SearchViewModel.class);
254266
}
255267

256268
@Override
@@ -905,7 +917,6 @@ private void onItemError(final Throwable exception) {
905917
// Utils
906918
//////////////////////////////////////////////////////////////////////////*/
907919

908-
@Override
909920
public void selectedFilters(@NonNull final List<FilterItem> theSelectedContentFilter,
910921
@NonNull final List<FilterItem> theSelectedSortFilter) {
911922

@@ -1072,32 +1083,18 @@ public void onSuggestionItemSwiped(@NonNull final RecyclerView.ViewHolder viewHo
10721083
}
10731084

10741085
private void showSelectFiltersDialog() {
1075-
final FragmentManager fragmentManager = getParentFragmentManager();
1086+
final FragmentManager fragmentManager = getChildFragmentManager();
10761087
final DialogFragment searchFilterUiDialog;
10771088

10781089
final String searchUi = PreferenceManager.getDefaultSharedPreferences(App.getApp())
10791090
.getString(getString(R.string.search_filter_ui_key),
10801091
getString(R.string.search_filter_ui_value));
1081-
if (getString(R.string.search_filter_ui_dialog_key).equals(searchUi)) {
1082-
searchFilterUiDialog =
1083-
SearchFilterDialogFragment.newInstance(
1084-
serviceId, userSelectedContentFilterList, userSelectedSortFilterList);
1085-
} else {
1086-
searchFilterUiDialog =
1087-
SearchFilterOptionMenuAlikeDialogFragment.newInstance(
1088-
serviceId, userSelectedContentFilterList, userSelectedSortFilterList);
1092+
if (getString(R.string.search_filter_ui_option_menu_style_key).equals(searchUi)) {
1093+
searchFilterUiDialog = new SearchFilterOptionMenuAlikeDialogFragment();
1094+
} else { // default dialog
1095+
searchFilterUiDialog = new SearchFilterDialogFragment();
10891096
}
10901097

1091-
searchFilterUiDialog.setTargetFragment(SearchFragment.this, 300);
10921098
searchFilterUiDialog.show(fragmentManager, "fragment_search");
10931099
}
1094-
1095-
@SuppressWarnings("checkstyle:HiddenField")
1096-
@Override
1097-
public void onFinishSearchFilterDialog(final List<Integer> userSelectedContentFilterList,
1098-
final List<Integer> userSelectedSortFilterList,
1099-
final List<FilterItem> selectedContentFilters,
1100-
final List<FilterItem> selectedSortFilters) {
1101-
selectedFilters(selectedContentFilters, selectedSortFilters);
1102-
}
11031100
}

0 commit comments

Comments
 (0)