Skip to content

Commit 2da5876

Browse files
committed
searchfilters: convert remaining search filter classes to ViewModel (part 3 of 3)
1 parent 717c102 commit 2da5876

12 files changed

Lines changed: 230 additions & 312 deletions

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

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99
import android.view.View;
1010

1111
import org.schabi.newpipe.R;
12-
import org.schabi.newpipe.extractor.NewPipe;
13-
import org.schabi.newpipe.extractor.StreamingService;
14-
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
12+
import org.schabi.newpipe.fragments.list.search.filter.SearchFilterLogic;
1513
import org.schabi.newpipe.fragments.list.search.filter.SearchFilterUIOptionMenu;
1614

1715
import androidx.annotation.NonNull;
@@ -34,31 +32,12 @@ public class SearchFragmentLegacy extends SearchFragment {
3432
private SearchFilterUIOptionMenu searchFilterUi;
3533

3634
@Override
37-
protected void initializeFilterData() {
38-
try {
39-
final StreamingService service = NewPipe.getService(serviceId);
35+
protected void initViewModel() {
36+
logicVariant = SearchFilterLogic.Factory.Variant.SEARCH_FILTER_LOGIC_LEGACY;
37+
super.initViewModel();
4038

41-
searchFilterUi = new SearchFilterUIOptionMenu(service, this, requireContext());
42-
searchFilterUi.restorePreviouslySelectedFilters(
43-
userSelectedContentFilterList,
44-
userSelectedSortFilterList);
45-
46-
userSelectedContentFilterList = searchFilterUi.getSelectedContentFilters();
47-
userSelectedSortFilterList = searchFilterUi.getSelectedSortFilters();
48-
selectedContentFilter = searchFilterUi.getSelectedContentFilterItems();
49-
selectedSortFilter = searchFilterUi.getSelectedSortFiltersItems();
50-
} catch (final ExtractionException e) {
51-
throw new RuntimeException(e);
52-
}
53-
}
54-
55-
@Override
56-
public void onSaveInstanceState(@NonNull final Bundle bundle) {
57-
// get data to save its state via Icepick
58-
userSelectedContentFilterList = searchFilterUi.getSelectedContentFilters();
59-
userSelectedSortFilterList = searchFilterUi.getSelectedSortFilters();
60-
61-
super.onSaveInstanceState(bundle);
39+
searchFilterUi = new SearchFilterUIOptionMenu(
40+
searchViewModel.getSearchFilterLogic(), requireContext());
6241
}
6342

6443
@Override

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,31 @@
1414

1515
import androidx.annotation.NonNull;
1616

17+
import static org.schabi.newpipe.fragments.list.search.filter.SearchFilterLogic.ICreateUiForFiltersWorker;
18+
1719
/**
1820
* Common base for the {@link SearchFilterDialogGenerator} and
1921
* {@link SearchFilterOptionMenuAlikeDialogGenerator}'s
20-
* {@link SearchFilterLogic.ICreateUiForFiltersWorker} implementation.
22+
* {@link ICreateUiForFiltersWorker} implementation.
2123
*/
2224
public abstract class BaseCreateSearchFilterUI
23-
implements SearchFilterLogic.ICreateUiForFiltersWorker {
25+
implements ICreateUiForFiltersWorker {
2426

2527
@NonNull
2628
protected final BaseSearchFilterUiDialogGenerator dialogGenBase;
2729
@NonNull
2830
protected final Context context;
2931
protected final List<View> titleViewElements = new ArrayList<>();
32+
protected final SearchFilterLogic logic;
3033
protected int titleResId;
3134

3235
protected BaseCreateSearchFilterUI(
3336
@NonNull final BaseSearchFilterUiDialogGenerator dialogGenBase,
37+
@NonNull final SearchFilterLogic logic,
3438
@NonNull final Context context,
3539
final int titleResId) {
3640
this.dialogGenBase = dialogGenBase;
41+
this.logic = logic;
3742
this.context = context;
3843
this.titleResId = titleResId;
3944
}
@@ -74,17 +79,18 @@ public static class CreateContentFilterUI extends CreateSortFilterUI {
7479

7580
public CreateContentFilterUI(
7681
@NonNull final BaseSearchFilterUiDialogGenerator dialogGenBase,
77-
@NonNull final Context context) {
78-
super(dialogGenBase, context);
82+
@NonNull final Context context,
83+
@NonNull final SearchFilterLogic logic) {
84+
super(dialogGenBase, context, logic);
7985
this.titleResId = R.string.filter_search_content_filters;
8086
}
8187

8288
@Override
8389
public void createFilterGroupBeforeItems(
8490
@NonNull final FilterGroup filterGroup) {
8591
dialogGenBase.createFilterGroup(filterGroup,
86-
dialogGenBase::addContentFilterUiWrapperToItemMap,
87-
dialogGenBase::selectContentFilter);
92+
logic::addContentFilterUiWrapperToItemMap,
93+
logic::selectContentFilter);
8894
}
8995

9096
@Override
@@ -97,8 +103,9 @@ public static class CreateSortFilterUI extends BaseCreateSearchFilterUI {
97103

98104
public CreateSortFilterUI(
99105
@NonNull final BaseSearchFilterUiDialogGenerator dialogGenBase,
100-
@NonNull final Context context) {
101-
super(dialogGenBase, context, R.string.filter_search_sort_filters);
106+
@NonNull final Context context,
107+
@NonNull final SearchFilterLogic logic) {
108+
super(dialogGenBase, logic, context, R.string.filter_search_sort_filters);
102109
}
103110

104111
@Override
@@ -109,8 +116,8 @@ public void prepare() {
109116
@Override
110117
public void createFilterGroupBeforeItems(@NonNull final FilterGroup filterGroup) {
111118
dialogGenBase.createFilterGroup(filterGroup,
112-
dialogGenBase::addSortFilterUiWrapperToItemMap,
113-
dialogGenBase::selectSortFilter);
119+
logic::addSortFilterUiWrapperToItemMap,
120+
logic::selectSortFilter);
114121
}
115122
}
116123
}

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

Lines changed: 21 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -8,87 +8,28 @@
88
import android.view.ViewGroup;
99

1010
import org.schabi.newpipe.R;
11-
import org.schabi.newpipe.extractor.NewPipe;
12-
import org.schabi.newpipe.extractor.StreamingService;
13-
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
14-
import org.schabi.newpipe.extractor.search.filter.FilterItem;
15-
16-
import java.util.ArrayList;
17-
import java.util.List;
11+
import org.schabi.newpipe.fragments.list.search.SearchViewModel;
1812

1913
import androidx.annotation.NonNull;
2014
import androidx.annotation.Nullable;
2115
import androidx.appcompat.widget.Toolbar;
2216
import androidx.fragment.app.DialogFragment;
23-
import icepick.Icepick;
24-
import icepick.State;
17+
import androidx.lifecycle.ViewModelProvider;
2518

2619
/**
2720
* Base dialog class for {@link DialogFragment} based search filter dialogs.
2821
*/
2922
public abstract class BaseSearchFilterDialogFragment extends DialogFragment {
3023

31-
private static final String CONTENT_FILTERS = "CONTENT_FILTERS";
32-
private static final String SORT_FILTERS = "SORT_FILTERS";
33-
private static final String SERVICE_ID = "SERVICE_ID";
34-
protected List<FilterItem> selectedContentFilters;
35-
protected List<FilterItem> selectedSortFilters;
3624
protected BaseSearchFilterUiGenerator dialogGenerator;
37-
@State
38-
ArrayList<Integer> userSelectedContentFilterList;
39-
@State
40-
ArrayList<Integer> userSelectedSortFilterList = null;
41-
42-
protected static DialogFragment initDialogArguments(
43-
@NonNull final DialogFragment dialogFragment,
44-
final int serviceId,
45-
final List<Integer> userSelectedContentFilter,
46-
final List<Integer> userSelectedSortFilter) {
47-
final Bundle bundle = new Bundle(1);
48-
bundle.putInt(SERVICE_ID, serviceId);
49-
bundle.putIntegerArrayList(CONTENT_FILTERS, new ArrayList<>(userSelectedContentFilter));
50-
bundle.putIntegerArrayList(SORT_FILTERS, new ArrayList<>(userSelectedSortFilter));
51-
dialogFragment.setArguments(bundle);
52-
53-
return dialogFragment;
54-
}
55-
56-
private void initializeFilterData() {
57-
58-
assert getArguments() != null;
59-
final int serviceId = getArguments().getInt(SERVICE_ID);
60-
final ArrayList<Integer> contentFilters =
61-
getArguments().getIntegerArrayList(CONTENT_FILTERS);
62-
final ArrayList<Integer> sortFilters =
63-
getArguments().getIntegerArrayList(SORT_FILTERS);
64-
65-
final StreamingService service;
66-
try {
67-
service = NewPipe.getService(serviceId);
68-
} catch (final ExtractionException e) {
69-
throw new RuntimeException(e);
70-
}
71-
72-
dialogGenerator = createSearchFilterDialogGenerator(service,
73-
(userSelectedContentFilter, userSelectedSortFilter) -> {
74-
selectedContentFilters = userSelectedContentFilter;
75-
selectedSortFilters = userSelectedSortFilter;
76-
sendDataToParentFragment();
77-
});
78-
79-
userSelectedContentFilterList = contentFilters;
80-
userSelectedSortFilterList = sortFilters;
81-
82-
dialogGenerator.restorePreviouslySelectedFilters(
83-
userSelectedContentFilterList,
84-
userSelectedSortFilterList);
25+
protected SearchViewModel searchViewModel;
8526

27+
private void createSearchFilterUi() {
28+
dialogGenerator = createSearchFilterDialogGenerator();
8629
dialogGenerator.createSearchUI();
8730
}
8831

89-
protected abstract BaseSearchFilterUiGenerator createSearchFilterDialogGenerator(
90-
StreamingService service,
91-
SearchFilterLogic.Callback callback);
32+
protected abstract BaseSearchFilterUiGenerator createSearchFilterDialogGenerator();
9233

9334
/**
9435
* As we have different bindings we need to get this sorted in a method.
@@ -101,19 +42,29 @@ protected abstract BaseSearchFilterUiGenerator createSearchFilterDialogGenerator
10142
protected abstract View getRootView(@NonNull LayoutInflater inflater,
10243
@Nullable ViewGroup container);
10344

45+
@Override
46+
public void onCreate(@Nullable final Bundle savedInstanceState) {
47+
super.onCreate(savedInstanceState);
48+
49+
// Make sure that the first parameter is pointing to instance of SearchFragment otherwise
50+
// another SearchViewModel object will be created instead of the existing one used.
51+
// -> the SearchViewModel is first instantiated in SearchFragment. Here we just use it.
52+
searchViewModel =
53+
new ViewModelProvider(requireParentFragment()).get(SearchViewModel.class);
54+
}
55+
10456
@Override
10557
public View onCreateView(@NonNull final LayoutInflater inflater,
10658
@Nullable final ViewGroup container,
10759
final Bundle savedInstanceState) {
10860
final View rootView = getRootView(inflater, container);
109-
initializeFilterData();
61+
createSearchFilterUi();
11062
return rootView;
11163
}
11264

11365
@Override
11466
public void onViewCreated(@NonNull final View view, final Bundle savedInstanceState) {
11567
super.onViewCreated(view, savedInstanceState);
116-
Icepick.restoreInstanceState(this, savedInstanceState);
11768

11869
final Toolbar toolbar = getToolbar();
11970
if (toolbar != null) {
@@ -143,44 +94,14 @@ protected void initToolbar(@NonNull final Toolbar toolbar) {
14394

14495
toolbar.setOnMenuItemClickListener(item -> {
14596
if (item.getItemId() == R.id.search) {
146-
dialogGenerator.prepareForSearch();
97+
searchViewModel.getSearchFilterLogic().prepareForSearch();
98+
dismiss();
14799
return true;
148100
} else if (item.getItemId() == R.id.reset) {
149-
dialogGenerator.reset();
101+
searchViewModel.getSearchFilterLogic().reset();
150102
return true;
151103
}
152104
return false;
153105
});
154106
}
155-
156-
@Override
157-
public void onSaveInstanceState(@NonNull final Bundle outState) {
158-
super.onSaveInstanceState(outState);
159-
// get data to save its state via Icepick
160-
userSelectedContentFilterList = dialogGenerator.getSelectedContentFilters();
161-
userSelectedSortFilterList = dialogGenerator.getSelectedSortFilters();
162-
163-
Icepick.saveInstanceState(this, outState);
164-
}
165-
166-
private void sendDataToParentFragment() {
167-
final Listener listener = (Listener) getTargetFragment();
168-
if (listener != null) {
169-
listener.onFinishSearchFilterDialog(
170-
userSelectedContentFilterList, userSelectedSortFilterList,
171-
selectedContentFilters, selectedSortFilters);
172-
}
173-
dismiss();
174-
}
175-
176-
/**
177-
* Listener to be implemented by the parent Fragment so it can receive data.
178-
*/
179-
public interface Listener {
180-
181-
void onFinishSearchFilterDialog(List<Integer> userSelectedContentFilterList,
182-
List<Integer> userSelectedSortFilterList,
183-
List<FilterItem> selectedContentFilters,
184-
List<FilterItem> selectedSortFilters);
185-
}
186107
}

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,22 @@
77
import android.view.ViewGroup;
88
import android.widget.TextView;
99

10-
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandlerFactory;
1110
import org.schabi.newpipe.extractor.search.filter.FilterGroup;
1211

1312
import java.util.List;
1413

1514
import androidx.annotation.NonNull;
16-
import androidx.annotation.Nullable;
1715

1816
import static android.util.TypedValue.COMPLEX_UNIT_DIP;
17+
import static org.schabi.newpipe.fragments.list.search.filter.SearchFilterLogic.ICreateUiForFiltersWorker;
1918

2019
public abstract class BaseSearchFilterUiDialogGenerator extends BaseSearchFilterUiGenerator {
2120
private static final float FONT_SIZE_TITLE_ITEMS_IN_DIP = 20f;
2221

2322
protected BaseSearchFilterUiDialogGenerator(
24-
@NonNull final SearchQueryHandlerFactory linkHandlerFactory,
25-
@Nullable final Callback callback,
23+
@NonNull final SearchFilterLogic logic,
2624
@NonNull final Context context) {
27-
super(linkHandlerFactory, callback, context);
25+
super(logic, context);
2826
}
2927

3028
protected abstract void createTitle(@NonNull String name,
@@ -36,12 +34,12 @@ protected abstract void createFilterGroup(@NonNull FilterGroup filterGroup,
3634

3735
@Override
3836
protected ICreateUiForFiltersWorker createContentFilterWorker() {
39-
return new BaseCreateSearchFilterUI.CreateContentFilterUI(this, context);
37+
return new BaseCreateSearchFilterUI.CreateContentFilterUI(this, context, logic);
4038
}
4139

4240
@Override
4341
protected ICreateUiForFiltersWorker createSortFilterWorker() {
44-
return new BaseCreateSearchFilterUI.CreateSortFilterUI(this, context);
42+
return new BaseCreateSearchFilterUI.CreateSortFilterUI(this, context, logic);
4543
}
4644

4745
@NonNull

0 commit comments

Comments
 (0)