Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / view / search / filter / FilterPresenter.java
1 package com.moiseum.wolnelektury.view.search.filter;
2
3 import android.os.Bundle;
4
5 import com.moiseum.wolnelektury.base.WLApplication;
6 import com.moiseum.wolnelektury.base.mvp.FragmentPresenter;
7 import com.moiseum.wolnelektury.connection.RestClient;
8 import com.moiseum.wolnelektury.connection.RestClientCallback;
9 import com.moiseum.wolnelektury.connection.models.CategoryModel;
10 import com.moiseum.wolnelektury.connection.services.CategoriesService;
11 import com.moiseum.wolnelektury.view.search.dto.FilterDto;
12
13 import java.util.List;
14
15 import retrofit2.Call;
16
17 /**
18  * Created by piotrostrowski on 25.11.2017.
19  */
20
21 public class FilterPresenter extends FragmentPresenter<FilterView> {
22
23         private FilterDto previousFilters;
24         private RestClient restClient;
25
26         private Call<List<CategoryModel>> epochsCall;
27         private Call<List<CategoryModel>> genresCall;
28         private Call<List<CategoryModel>> kindsCall;
29
30         FilterPresenter(FilterView view, FilterDto filters) {
31                 super(view);
32                 this.previousFilters = filters;
33                 this.restClient = WLApplication.getInstance().getRestClient();
34         }
35
36         @Override
37         public void onViewCreated(Bundle savedInstanceState) {
38                 super.onViewCreated(savedInstanceState);
39                 loadEpochs();
40                 loadGenres();
41                 loadKinds();
42         }
43
44         @Override
45         public void onDestroy() {
46                 super.onDestroy();
47                 if (epochsCall != null) {
48                         epochsCall.cancel();
49                 }
50                 if (genresCall != null) {
51                         genresCall.cancel();
52                 }
53                 if (kindsCall != null) {
54                         kindsCall.cancel();
55                 }
56         }
57
58         void loadKinds() {
59                 kindsCall = restClient.call(new RestClientCallback<List<CategoryModel>, CategoriesService>() {
60                         @Override
61                         public void onSuccess(List<CategoryModel> data) {
62                                 matchFilters(previousFilters.getFilteredKinds(), data);
63                                 getView().displayKinds(data);
64                         }
65
66                         @Override
67                         public void onFailure(Exception e) {
68                                 getView().showKindsError();
69                         }
70
71                         @Override
72                         public void onCancel() {
73                                 // nop.
74                         }
75
76                         @Override
77                         public Call<List<CategoryModel>> execute(CategoriesService service) {
78                                 return service.getKinds(true);
79                         }
80                 }, CategoriesService.class);
81         }
82
83         void loadGenres() {
84                 genresCall = restClient.call(new RestClientCallback<List<CategoryModel>, CategoriesService>() {
85                         @Override
86                         public void onSuccess(List<CategoryModel> data) {
87                                 matchFilters(previousFilters.getFilteredGenres(), data);
88                                 getView().displayGenres(data);
89                         }
90
91                         @Override
92                         public void onFailure(Exception e) {
93                                 getView().showGenresError();
94                         }
95
96                         @Override
97                         public void onCancel() {
98                                 // nop.
99                         }
100
101                         @Override
102                         public Call<List<CategoryModel>> execute(CategoriesService service) {
103                                 return service.getGenres(true);
104                         }
105                 }, CategoriesService.class);
106         }
107
108         void loadEpochs() {
109                 epochsCall = restClient.call(new RestClientCallback<List<CategoryModel>, CategoriesService>() {
110                         @Override
111                         public void onSuccess(List<CategoryModel> data) {
112                                 matchFilters(previousFilters.getFilteredEpochs(), data);
113                                 getView().displayEpochs(data);
114                         }
115
116                         @Override
117                         public void onFailure(Exception e) {
118                                 getView().showEpochsError();
119                         }
120
121                         @Override
122                         public void onCancel() {
123                                 // nop.
124                         }
125
126                         @Override
127                         public Call<List<CategoryModel>> execute(CategoriesService service) {
128                                 return service.getEpochs(true);
129                         }
130                 }, CategoriesService.class);
131         }
132
133         private void matchFilters(List<CategoryModel> previousFilters, List<CategoryModel> currentFilters) {
134                 for (CategoryModel model : currentFilters) {
135                         for (CategoryModel prevModel : previousFilters) {
136                                 if (model.getSlug().equals(prevModel.getSlug())) {
137                                         model.setChecked(true);
138                                         break;
139                                 }
140                         }
141                 }
142         }
143
144         void updateFilters(boolean lecturesOnly, boolean audiobook, List<CategoryModel> epochs, List<CategoryModel> genres, List<CategoryModel> kinds) {
145                 FilterDto dto = new FilterDto();
146                 dto.setLecture(lecturesOnly);
147                 dto.setAudiobook(audiobook);
148                 dto.setFilteredEpochs(epochs);
149                 dto.setFilteredGenres(genres);
150                 dto.setFilteredKinds(kinds);
151                 getView().applyFilters(dto);
152         }
153 }