2
2
3
3
import static fr .free .nrw .commons .profile .leaderboard .LeaderboardConstants .LOADED ;
4
4
import static fr .free .nrw .commons .profile .leaderboard .LeaderboardConstants .LOADING ;
5
+ import static fr .free .nrw .commons .profile .leaderboard .LeaderboardConstants .PAGE_SIZE ;
6
+ import static fr .free .nrw .commons .profile .leaderboard .LeaderboardConstants .START_OFFSET ;
5
7
6
8
import android .accounts .Account ;
7
9
import android .os .Bundle ;
8
10
import android .view .LayoutInflater ;
9
11
import android .view .View ;
10
12
import android .view .ViewGroup ;
13
+ import android .widget .AdapterView ;
14
+ import android .widget .AdapterView .OnItemSelectedListener ;
15
+ import android .widget .ArrayAdapter ;
11
16
import android .widget .ProgressBar ;
17
+ import android .widget .Spinner ;
12
18
import androidx .lifecycle .ViewModelProvider ;
13
19
import androidx .recyclerview .widget .LinearLayoutManager ;
14
20
import androidx .recyclerview .widget .MergeAdapter ;
@@ -35,6 +41,12 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
35
41
@ BindView (R .id .progressBar )
36
42
ProgressBar progressBar ;
37
43
44
+ @ BindView (R .id .category_spinner )
45
+ Spinner categorySpinner ;
46
+
47
+ @ BindView (R .id .duration_spinner )
48
+ Spinner durationSpinner ;
49
+
38
50
@ Inject
39
51
SessionManager sessionManager ;
40
52
@@ -48,32 +60,91 @@ public class LeaderboardFragment extends CommonsDaggerSupportFragment {
48
60
49
61
private CompositeDisposable compositeDisposable = new CompositeDisposable ();
50
62
63
+ String duration ;
64
+ String category ;
65
+ int limit = PAGE_SIZE ;
66
+ int offset = START_OFFSET ;
67
+
51
68
@ Override
52
69
public View onCreateView (LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState ) {
53
70
View rootView = inflater .inflate (R .layout .fragment_leaderboard , container , false );
54
71
ButterKnife .bind (this , rootView );
72
+
55
73
progressBar .setVisibility (View .VISIBLE );
56
74
hideLayouts ();
57
- setLeaderboard ();
75
+ setSpinners ();
76
+
77
+ String [] durationValues = getContext ().getResources ().getStringArray (R .array .leaderboard_duration_values );
78
+ String [] categoryValues = getContext ().getResources ().getStringArray (R .array .leaderboard_category_values );
79
+
80
+ duration = durationValues [0 ];
81
+ category = categoryValues [0 ];
82
+
83
+ setLeaderboard (duration , category , limit , offset );
84
+
85
+ durationSpinner .setOnItemSelectedListener (new OnItemSelectedListener () {
86
+ @ Override
87
+ public void onItemSelected (AdapterView <?> adapterView , View view , int i , long l ) {
88
+
89
+ duration = durationValues [durationSpinner .getSelectedItemPosition ()];
90
+ refreshLeaderboard ();
91
+ }
92
+
93
+ @ Override
94
+ public void onNothingSelected (AdapterView <?> adapterView ) {
95
+ }
96
+ });
97
+
98
+ categorySpinner .setOnItemSelectedListener (new OnItemSelectedListener () {
99
+ @ Override
100
+ public void onItemSelected (AdapterView <?> adapterView , View view , int i , long l ) {
101
+ category = categoryValues [categorySpinner .getSelectedItemPosition ()];
102
+ refreshLeaderboard ();
103
+ }
104
+
105
+ @ Override
106
+ public void onNothingSelected (AdapterView <?> adapterView ) {
107
+ }
108
+ });
109
+
58
110
return rootView ;
59
111
}
60
112
113
+ private void refreshLeaderboard () {
114
+ if (viewModel != null ) {
115
+ viewModel .refresh (duration , category , limit , offset );
116
+ setLeaderboard (duration , category , limit , offset );
117
+ }
118
+ }
119
+
120
+ private void setSpinners () {
121
+ ArrayAdapter <CharSequence > categoryAdapter = ArrayAdapter .createFromResource (getContext (),
122
+ R .array .leaderboard_categories , android .R .layout .simple_spinner_item );
123
+ categoryAdapter .setDropDownViewResource (android .R .layout .simple_spinner_dropdown_item );
124
+ categorySpinner .setAdapter (categoryAdapter );
125
+
126
+ ArrayAdapter <CharSequence > durationAdapter = ArrayAdapter .createFromResource (getContext (),
127
+ R .array .leaderboard_durations , android .R .layout .simple_spinner_item );
128
+ durationAdapter .setDropDownViewResource (android .R .layout .simple_spinner_dropdown_item );
129
+ durationSpinner .setAdapter (durationAdapter );
130
+ }
131
+
61
132
/**
62
133
* To call the API to get results
63
134
* which then sets the views using setLeaderboardUser method
64
135
*/
65
- private void setLeaderboard () {
136
+ private void setLeaderboard (String duration , String category , int limit , int offset ) {
66
137
if (checkAccount ()) {
67
138
try {
68
139
compositeDisposable .add (okHttpJsonApiClient
69
140
.getLeaderboard (Objects .requireNonNull (sessionManager .getCurrentAccount ()).name ,
70
- "all_time" , "upload" , null , null )
141
+ duration , category , null , null )
71
142
.subscribeOn (Schedulers .io ())
72
143
.observeOn (AndroidSchedulers .mainThread ())
73
144
.subscribe (
74
145
response -> {
75
146
if (response != null && response .getStatus () == 200 ) {
76
- setViews (response );
147
+ setViews (response , duration , category , limit , offset );
77
148
}
78
149
},
79
150
t -> {
@@ -92,22 +163,22 @@ private void setLeaderboard() {
92
163
* Set the views
93
164
* @param response Leaderboard Response Object
94
165
*/
95
- private void setViews (LeaderboardResponse response ) {
166
+ private void setViews (LeaderboardResponse response , String duration , String category , int limit , int offset ) {
96
167
viewModel = new ViewModelProvider (this , viewModelFactory ).get (LeaderboardListViewModel .class );
168
+ viewModel .setParams (duration , category , limit , offset );
97
169
LeaderboardListAdapter leaderboardListAdapter = new LeaderboardListAdapter ();
98
170
UserDetailAdapter userDetailAdapter = new UserDetailAdapter (response );
99
171
MergeAdapter mergeAdapter = new MergeAdapter (userDetailAdapter , leaderboardListAdapter );
100
172
LinearLayoutManager linearLayoutManager = new LinearLayoutManager (getContext ());
101
173
leaderboardListRecyclerView .setLayoutManager (linearLayoutManager );
102
174
leaderboardListRecyclerView .setAdapter (mergeAdapter );
103
-
104
175
viewModel .getListLiveData ().observe (getViewLifecycleOwner (), leaderboardListAdapter ::submitList );
105
176
viewModel .getProgressLoadStatus ().observe (getViewLifecycleOwner (), status -> {
106
- if (Objects .requireNonNull (status ).equalsIgnoreCase (LOADING )) {
107
- showProgressBar ();
108
- } else if (status .equalsIgnoreCase (LOADED )) {
109
- hideProgressBar ();
110
- }
177
+ if (Objects .requireNonNull (status ).equalsIgnoreCase (LOADING )) {
178
+ showProgressBar ();
179
+ } else if (status .equalsIgnoreCase (LOADED )) {
180
+ hideProgressBar ();
181
+ }
111
182
});
112
183
}
113
184
@@ -117,6 +188,8 @@ private void setViews(LeaderboardResponse response) {
117
188
private void hideProgressBar () {
118
189
if (progressBar != null ) {
119
190
progressBar .setVisibility (View .GONE );
191
+ categorySpinner .setVisibility (View .VISIBLE );
192
+ durationSpinner .setVisibility (View .VISIBLE );
120
193
leaderboardListRecyclerView .setVisibility (View .VISIBLE );
121
194
}
122
195
}
@@ -134,6 +207,8 @@ private void showProgressBar() {
134
207
* used to hide the layouts while fetching results from api
135
208
*/
136
209
private void hideLayouts (){
210
+ categorySpinner .setVisibility (View .INVISIBLE );
211
+ durationSpinner .setVisibility (View .INVISIBLE );
137
212
leaderboardListRecyclerView .setVisibility (View .INVISIBLE );
138
213
}
139
214
0 commit comments