1
1
package org .fossasia .openevent .core .schedule ;
2
2
3
+ import android .arch .lifecycle .ViewModelProviders ;
3
4
import android .content .Context ;
4
5
import android .os .Bundle ;
5
6
import android .support .annotation .NonNull ;
29
30
import org .fossasia .openevent .common .ui .Views ;
30
31
import org .fossasia .openevent .common .ui .base .BaseFragment ;
31
32
import org .fossasia .openevent .common .ui .recyclerview .stickyheadersrecyclerview .StickyRecyclerHeadersDecoration ;
32
- import org .fossasia .openevent .common .utils .SortOrder ;
33
33
import org .fossasia .openevent .common .utils .Utils ;
34
34
import org .fossasia .openevent .config .StrategyRegistry ;
35
35
import org .fossasia .openevent .core .bookmark .OnBookmarkSelectedListener ;
36
36
import org .fossasia .openevent .data .Session ;
37
- import org .fossasia .openevent .data .repository .RealmDataRepository ;
38
-
39
37
import java .lang .ref .WeakReference ;
40
38
import java .util .ArrayList ;
41
- import java .util .Collections ;
42
39
import java .util .List ;
43
40
44
41
import butterknife .BindView ;
45
- import io .realm .RealmResults ;
46
42
import timber .log .Timber ;
47
43
48
44
public class DayScheduleFragment extends BaseFragment implements SearchView .OnQueryTextListener {
49
45
50
- final private String SEARCH = "searchText" ;
51
-
52
46
private Context context ;
47
+ private String date ;
53
48
private String searchText = "" ;
54
49
private SearchView searchView ;
55
50
@@ -58,15 +53,12 @@ public class DayScheduleFragment extends BaseFragment implements SearchView.OnQu
58
53
@ BindView (R .id .txt_no_schedule ) TextView noSchedule ;
59
54
@ BindView (R .id .txt_no_result_schedule ) protected TextView noResultsSchedule ;
60
55
61
- private List <Session > sessions = new ArrayList <>();
62
56
private List <Session > filteredSessions = new ArrayList <>();
63
57
private DayScheduleAdapter dayScheduleAdapter ;
64
- private OnBookmarkSelectedListener onBookmarkSelectedListener ;
65
58
66
- private String date ;
67
- private RealmDataRepository realmRepo = RealmDataRepository .getDefaultInstance ();
68
- private RealmResults <Session > realmResults ;
59
+ private OnBookmarkSelectedListener onBookmarkSelectedListener ;
69
60
private RecyclerView .AdapterDataObserver adapterDataObserver ;
61
+ private DayScheduleFragmentViewModel dayScheduleFragmentViewModel ;
70
62
71
63
@ Override
72
64
public void onCreate (@ Nullable Bundle savedInstanceState ) {
@@ -85,32 +77,22 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
85
77
Utils .registerIfUrlValid (swipeRefreshLayout , this , this ::refresh );
86
78
setUpRecyclerView ();
87
79
88
- if ( savedInstanceState != null && savedInstanceState . getString ( SEARCH ) != null ) {
89
- searchText = savedInstanceState . getString ( SEARCH );
90
- }
80
+ // Set up view model
81
+ dayScheduleFragmentViewModel = ViewModelProviders . of ( this ). get ( DayScheduleFragmentViewModel . class );
82
+ searchText = dayScheduleFragmentViewModel . getSearchText ();
91
83
92
- realmResults = realmRepo . getSessionsByDate ( date , SortOrder . sortTypeSchedule () );
93
- realmResults . addChangeListener (( sortedSessions , orderedCollectionChangeSet ) -> {
94
- sessions . clear () ;
95
- sessions . addAll ( sortedSessions );
84
+ loadSessions ( );
85
+ handleVisibility ();
86
+ return view ;
87
+ }
96
88
89
+ private void loadSessions () {
90
+ dayScheduleFragmentViewModel .getSessionsByDate (date , searchText ).observe (DayScheduleFragment .this , sessions -> {
97
91
filteredSessions .clear ();
98
- filteredSessions .addAll (sortedSessions );
99
-
100
- dayScheduleAdapter .setCopy (sortedSessions );
92
+ filteredSessions .addAll (sessions );
101
93
dayScheduleAdapter .notifyDataSetChanged ();
102
- if (!Utils .isEmpty (searchText ))
103
- dayScheduleAdapter .filter (searchText );
104
-
105
- if (SortOrder .sortOrderSchedule () == SortOrder .SORT_ORDER_DESCENDING )
106
- Collections .reverse (filteredSessions );
107
-
108
94
handleVisibility ();
109
95
});
110
-
111
- handleVisibility ();
112
-
113
- return view ;
114
96
}
115
97
116
98
private void setUpRecyclerView () {
@@ -121,7 +103,6 @@ private void setUpRecyclerView() {
121
103
dayRecyclerView .setLayoutManager (new LinearLayoutManager (context , LinearLayoutManager .VERTICAL , false ));
122
104
dayRecyclerView .addItemDecoration (new DividerItemDecoration (context , DividerItemDecoration .VERTICAL ));
123
105
dayRecyclerView .setAdapter (dayScheduleAdapter );
124
- dayScheduleAdapter .setEventDate (date );
125
106
126
107
final StickyRecyclerHeadersDecoration headersDecoration = new StickyRecyclerHeadersDecoration (dayScheduleAdapter );
127
108
dayRecyclerView .addItemDecoration (headersDecoration );
@@ -134,39 +115,26 @@ public void onChanged() {
134
115
dayScheduleAdapter .registerAdapterDataObserver (adapterDataObserver );
135
116
}
136
117
137
- public void filter (List <String > selectedTracks ) {
138
- if (dayScheduleAdapter == null )
139
- return ;
140
-
141
- realmRepo .getSessionsByDate (date , SortOrder .sortTypeSchedule ())
142
- .addChangeListener ((sortedSessions , orderedCollectionChangeSet ) -> {
143
- sessions .clear ();
144
- sessions .addAll (sortedSessions );
145
-
146
- filteredSessions .clear ();
147
- if (selectedTracks .isEmpty ()) {
148
- filteredSessions .addAll (sessions );
149
- } else {
150
- for (int i = 0 ; i < sessions .size () ; i ++) {
151
- String trackName = sessions .get (i ).getTrack ().getName ();
152
- if (selectedTracks .contains (trackName )) {
153
- filteredSessions .add (sessions .get (i ));
154
- }
155
- }
156
-
157
- if (searchText !=null )
158
- dayScheduleAdapter .filter (searchText );
159
- }
160
-
161
- if (SortOrder .sortOrderSchedule () == SortOrder .SORT_ORDER_DESCENDING )
162
- Collections .reverse (filteredSessions );
163
-
164
- dayScheduleAdapter .notifyDataSetChanged ();
165
-
166
- handleVisibility ();
167
- });
118
+ public void filterByTracks (List <String > selectedTracks ) {
119
+ dayScheduleFragmentViewModel .getSortedSessionsByTracks (searchText , selectedTracks ).observe (DayScheduleFragment .this , trackSessions -> {
120
+ filteredSessions .clear ();
121
+ filteredSessions .addAll (trackSessions );
122
+ dayScheduleAdapter .notifyDataSetChanged ();
123
+ handleVisibility ();
124
+ });
125
+ }
126
+
127
+ public void filterByQuery (String query ) {
128
+ searchText = query ;
129
+ dayScheduleFragmentViewModel .getSessionsBySearchText (searchText ).observe (DayScheduleFragment .this , matchingSessions -> {
130
+ filteredSessions .clear ();
131
+ filteredSessions .addAll (matchingSessions );
132
+ dayScheduleAdapter .notifyDataSetChanged ();
133
+ handleVisibility ();
134
+ });
168
135
}
169
136
137
+
170
138
private void handleVisibility () {
171
139
if (dayRecyclerView != null && noSchedule != null ) {
172
140
if (!filteredSessions .isEmpty ()) {
@@ -177,7 +145,6 @@ private void handleVisibility() {
177
145
}
178
146
}
179
147
180
-
181
148
@ Override
182
149
protected int getLayoutResource () {
183
150
return R .layout .list_schedule ;
@@ -190,7 +157,6 @@ public void onDestroyView() {
190
157
dayScheduleAdapter .unregisterAdapterDataObserver (adapterDataObserver );
191
158
192
159
// Remove listeners to fix memory leak
193
- realmResults .removeAllChangeListeners ();
194
160
if (swipeRefreshLayout != null ) swipeRefreshLayout .setOnRefreshListener (null );
195
161
if (searchView != null ) searchView .setOnQueryTextListener (null );
196
162
}
@@ -202,7 +168,8 @@ public void onSessionsDownloadDone(SessionDownloadEvent event) {
202
168
if (event .isState ()) {
203
169
Timber .i ("Schedule download completed" );
204
170
if (searchView != null && !searchView .getQuery ().toString ().isEmpty () && !searchView .isIconified ()) {
205
- dayScheduleAdapter .filter (searchView .getQuery ().toString ());
171
+ searchText = searchView .getQuery ().toString ();
172
+ filterByQuery (searchText );
206
173
}
207
174
} else {
208
175
Timber .i ("Schedule download failed" );
@@ -212,19 +179,10 @@ public void onSessionsDownloadDone(SessionDownloadEvent event) {
212
179
}
213
180
}
214
181
215
- @ Override
216
- public void onSaveInstanceState (@ NonNull Bundle bundle ) {
217
- if (isAdded () && searchView != null ) {
218
- bundle .putString (SEARCH , searchText );
219
- }
220
- super .onSaveInstanceState (bundle );
221
- }
222
-
223
182
@ Override
224
183
public void onCreateOptionsMenu (Menu menu , MenuInflater inflater ) {
225
184
super .onCreateOptionsMenu (menu , inflater );
226
185
227
- searchText = "" ;
228
186
inflater .inflate (R .menu .menu_schedule , menu );
229
187
230
188
MenuItem item = menu .findItem (R .id .action_search_schedule );
@@ -238,10 +196,9 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
238
196
@ Override
239
197
public boolean onQueryTextChange (String query ) {
240
198
searchText = query ;
241
-
242
- dayScheduleAdapter .filter ( searchText );
199
+ filterByQuery ( searchText );
200
+ dayScheduleAdapter .animateTo ( filteredSessions );
243
201
Utils .displayNoResults (noResultsSchedule , dayRecyclerView , noSchedule , dayScheduleAdapter .getItemCount ());
244
-
245
202
return true ;
246
203
}
247
204
0 commit comments