88import android .view .ViewGroup ;
99
1010import 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
1913import androidx .annotation .NonNull ;
2014import androidx .annotation .Nullable ;
2115import androidx .appcompat .widget .Toolbar ;
2216import 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 */
2922public 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}
0 commit comments