Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / view / main / MainPresenter.java
1 package com.moiseum.wolnelektury.view.main;
2
3 import android.net.Uri;
4 import android.util.Log;
5
6 import com.moiseum.wolnelektury.R;
7 import com.moiseum.wolnelektury.base.WLApplication;
8 import com.moiseum.wolnelektury.base.mvp.Presenter;
9 import com.moiseum.wolnelektury.connection.RestClient;
10 import com.moiseum.wolnelektury.connection.RestClientCallback;
11 import com.moiseum.wolnelektury.connection.models.BookDetailsModel;
12 import com.moiseum.wolnelektury.connection.models.OAuthTokenModel;
13 import com.moiseum.wolnelektury.connection.models.UserModel;
14 import com.moiseum.wolnelektury.connection.services.BooksService;
15 import com.moiseum.wolnelektury.connection.services.UserService;
16 import com.moiseum.wolnelektury.events.LoggedInEvent;
17 import com.moiseum.wolnelektury.utils.SharedPreferencesUtils;
18 import com.moiseum.wolnelektury.view.main.events.PremiumStatusEvent;
19
20 import org.greenrobot.eventbus.EventBus;
21
22 import java.util.List;
23
24 import retrofit2.Call;
25
26 /**
27  * Created by Piotr Ostrowski on 12.06.2018.
28  */
29 class MainPresenter extends Presenter<MainView> {
30
31         private static final String TAG = MainPresenter.class.getSimpleName();
32         private static final String OAUTH_CALLBACK_VALUE = "wolnelekturyapp://oauth.callback/?oauth_token=";
33         private static final String PAYPAL_SUCCESS_CALLBACK_VALUE = "wolnelekturyapp://paypal_return";
34         private static final String PAYPAL_ERROR_CALLBACK_VALUE = "wolnelekturyapp://paypal_error";
35
36         private RestClient client = WLApplication.getInstance().getRestClient();
37         private SharedPreferencesUtils preferences = WLApplication.getInstance().getPreferences();
38         private Call currentCall;
39         private Call checkCall;
40
41         MainPresenter(MainView view) {
42                 super(view);
43                 getView().setLoggedIn(preferences.isUserLoggedIn());
44                 getView().setLoggedUsername(preferences.getUsername());
45         }
46
47         @Override
48         public void onResume() {
49                 super.onResume();
50                 if (preferences.isUserLoggedIn()) {
51                         checkPremiumStatus();
52                 }
53         }
54
55         @Override
56         public void onDestroy() {
57                 super.onDestroy();
58                 if (currentCall != null) {
59                         currentCall.cancel();
60                 }
61                 if (checkCall != null) {
62                         checkCall.cancel();
63                 }
64         }
65
66         void onLoginClicked() {
67                 getView().setProgressDialogVisibility(true);
68                 currentCall = client.call(new RestClientCallback<OAuthTokenModel, UserService>() {
69
70                         @Override
71                         public void onSuccess(OAuthTokenModel data) {
72                                 preferences.setTemporaryLoginToken(data.getToken());
73                                 String authUrl = String.format(RestClient.WEB_OAUTH_AUTHORIZATION_URL, data.getToken());
74                                 getView().setProgressDialogVisibility(false);
75                                 getView().showCustomTabsAuthentication(Uri.parse(authUrl));
76                         }
77
78                         @Override
79                         public void onFailure(Exception e) {
80                                 Log.e(TAG, "Failed to obtain request token.", e);
81                                 getView().setProgressDialogVisibility(false);
82                                 getView().showToastMessage(R.string.login_request_token_failed);
83                         }
84
85                         @Override
86                         public void onCancel() {
87                                 getView().setProgressDialogVisibility(false);
88                         }
89
90                         @Override
91                         public Call<OAuthTokenModel> execute(UserService service) {
92                                 return service.requestToken();
93                         }
94                 }, UserService.class);
95         }
96
97         void onLogoutClicked() {
98                 client.clearOAuthTokens();
99                 preferences.clearUserData();
100                 getView().relaunch(R.string.logout_successful);
101         }
102
103         void onBecomeAFriendClick() {
104                 if (preferences.isUserLoggedIn()) {
105                         getView().showPremiumForm();
106                 } else {
107                         getView().showLoginFirst();
108                 }
109         }
110
111         void onBrowserCallback(String intentData) {
112                 if (PAYPAL_SUCCESS_CALLBACK_VALUE.equals(intentData)) {
113                         preferences.setPremium(true);
114                         EventBus.getDefault().post(new PremiumStatusEvent(true));
115                         getView().showToastMessage(R.string.premium_purchase_succeeded);
116                 } else if (PAYPAL_ERROR_CALLBACK_VALUE.equals(intentData)) {
117                         getView().showToastMessage(R.string.premium_purchase_failed);
118                 } else {
119                         onAuthorizationIntent(intentData);
120                 }
121         }
122
123         void checkForPremiumBook() {
124                 fetchHeader();
125         }
126
127         private void onAuthorizationIntent(String intentData) {
128                 String correctDataString = OAUTH_CALLBACK_VALUE + preferences.getTemporaryLoginToken();
129                 if (intentData.compareTo(correctDataString) != 0) {
130                         getView().showToastMessage(R.string.login_auth_callback_malformed);
131                         return;
132                 }
133
134                 getView().setProgressDialogVisibility(true);
135                 currentCall = client.call(new RestClientCallback<OAuthTokenModel, UserService>() {
136
137                         @Override
138                         public void onSuccess(OAuthTokenModel data) {
139                                 preferences.storeAccessToken(data);
140                                 fetchUser();
141                         }
142
143                         @Override
144                         public void onFailure(Exception e) {
145                                 Log.e(TAG, "Failed to obtain access token.", e);
146                                 getView().setProgressDialogVisibility(false);
147                                 getView().showToastMessage(R.string.login_access_token_failed);
148                         }
149
150                         @Override
151                         public void onCancel() {
152                                 getView().setProgressDialogVisibility(false);
153                         }
154
155                         @Override
156                         public Call<OAuthTokenModel> execute(UserService service) {
157                                 return service.accessToken();
158                         }
159                 }, UserService.class);
160         }
161
162         private void fetchUser() {
163                 getView().setProgressDialogVisibility(true);
164
165                 /*
166                  * We are marking user as logged in cause we already have credentials at this point.
167                  * If this request fails we can perform it later on and ignore those errors for now.
168                  */
169                 currentCall = client.call(new RestClientCallback<UserModel, UserService>() {
170                         @Override
171                         public void onSuccess(UserModel userModel) {
172                                 preferences.setUsername(userModel.getUsername());
173                                 preferences.setPremium(userModel.isPremium());
174                                 EventBus.getDefault().post(new LoggedInEvent());
175                                 getView().setProgressDialogVisibility(false);
176                                 getView().setLoggedIn(true);
177                                 getView().setLoggedUsername(userModel.getUsername());
178                         }
179
180                         @Override
181                         public void onFailure(Exception e) {
182                                 EventBus.getDefault().post(new LoggedInEvent());
183                                 getView().setProgressDialogVisibility(false);
184                                 getView().setLoggedIn(true);
185                         }
186
187                         @Override
188                         public void onCancel() {
189                                 EventBus.getDefault().post(new LoggedInEvent());
190                                 getView().setProgressDialogVisibility(false);
191                                 getView().setLoggedIn(true);
192                         }
193
194                         @Override
195                         public Call<UserModel> execute(UserService service) {
196                                 return service.getUser();
197                         }
198                 }, UserService.class);
199         }
200
201         private void fetchHeader() {
202                 getView().setProgressDialogVisibility(true);
203                 currentCall = client.call(new RestClientCallback<List<BookDetailsModel>, BooksService>() {
204                         @Override
205                         public void onSuccess(List<BookDetailsModel> data) {
206                                 getView().setProgressDialogVisibility(false);
207                                 if (data.size() > 0) {
208                                         getView().showPremiumBook(data.get(0).getSlug());
209                                 } else {
210                                         getView().showNoPremiumBookAvailable(preferences.isUserLoggedIn());
211                                 }
212                         }
213
214                         @Override
215                         public void onFailure(Exception e) {
216                                 getView().showToastMessage(R.string.fetching_premium_failed);
217                         }
218
219                         @Override
220                         public void onCancel() {
221                                 // nop.
222                         }
223
224                         @Override
225                         public Call<List<BookDetailsModel>> execute(BooksService service) {
226                                 return service.getPreview();
227                         }
228                 }, BooksService.class);
229         }
230
231         private void checkPremiumStatus() {
232                 checkCall = client.call(new RestClientCallback<UserModel, UserService>() {
233                         @Override
234                         public void onSuccess(UserModel userModel) {
235                                 boolean currentPremiumStatus = preferences.isUserPremium();
236                                 preferences.setUsername(userModel.getUsername());
237                                 preferences.setPremium(userModel.isPremium());
238                                 if (currentPremiumStatus && !userModel.isPremium()) {
239                                         getView().relaunch(R.string.subscription_lost);
240                                 }
241                         }
242
243                         @Override
244                         public void onFailure(Exception e) {
245                                 // nop
246                         }
247
248                         @Override
249                         public void onCancel() {
250                                 // nop
251                         }
252
253                         @Override
254                         public Call<UserModel> execute(UserService service) {
255                                 return service.getUser();
256                         }
257                 }, UserService.class);
258         }
259 }