1 package com.moiseum.wolnelektury.view.main;
3 import android.net.Uri;
4 import android.util.Log;
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;
20 import org.greenrobot.eventbus.EventBus;
22 import java.util.List;
24 import retrofit2.Call;
27 * Created by Piotr Ostrowski on 12.06.2018.
29 class MainPresenter extends Presenter<MainView> {
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";
36 private RestClient client = WLApplication.getInstance().getRestClient();
37 private SharedPreferencesUtils preferences = WLApplication.getInstance().getPreferences();
38 private Call currentCall;
39 private Call checkCall;
41 MainPresenter(MainView view) {
43 getView().setLoggedIn(preferences.isUserLoggedIn());
44 getView().setLoggedUsername(preferences.getUsername());
48 public void onResume() {
50 if (preferences.isUserLoggedIn()) {
56 public void onDestroy() {
58 if (currentCall != null) {
61 if (checkCall != null) {
66 void onLoginClicked() {
67 getView().setProgressDialogVisibility(true);
68 currentCall = client.call(new RestClientCallback<OAuthTokenModel, UserService>() {
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));
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);
86 public void onCancel() {
87 getView().setProgressDialogVisibility(false);
91 public Call<OAuthTokenModel> execute(UserService service) {
92 return service.requestToken();
94 }, UserService.class);
97 void onLogoutClicked() {
98 client.clearOAuthTokens();
99 preferences.clearUserData();
100 getView().relaunch(R.string.logout_successful);
103 void onBecomeAFriendClick() {
104 if (preferences.isUserLoggedIn()) {
105 getView().showPremiumForm();
107 getView().showLoginFirst();
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);
119 onAuthorizationIntent(intentData);
123 void checkForPremiumBook() {
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);
134 getView().setProgressDialogVisibility(true);
135 currentCall = client.call(new RestClientCallback<OAuthTokenModel, UserService>() {
138 public void onSuccess(OAuthTokenModel data) {
139 preferences.storeAccessToken(data);
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);
151 public void onCancel() {
152 getView().setProgressDialogVisibility(false);
156 public Call<OAuthTokenModel> execute(UserService service) {
157 return service.accessToken();
159 }, UserService.class);
162 private void fetchUser() {
163 getView().setProgressDialogVisibility(true);
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.
169 currentCall = client.call(new RestClientCallback<UserModel, UserService>() {
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());
181 public void onFailure(Exception e) {
182 EventBus.getDefault().post(new LoggedInEvent());
183 getView().setProgressDialogVisibility(false);
184 getView().setLoggedIn(true);
188 public void onCancel() {
189 EventBus.getDefault().post(new LoggedInEvent());
190 getView().setProgressDialogVisibility(false);
191 getView().setLoggedIn(true);
195 public Call<UserModel> execute(UserService service) {
196 return service.getUser();
198 }, UserService.class);
201 private void fetchHeader() {
202 getView().setProgressDialogVisibility(true);
203 currentCall = client.call(new RestClientCallback<List<BookDetailsModel>, BooksService>() {
205 public void onSuccess(List<BookDetailsModel> data) {
206 getView().setProgressDialogVisibility(false);
207 if (data.size() > 0) {
208 getView().showPremiumBook(data.get(0).getSlug());
210 getView().showNoPremiumBookAvailable(preferences.isUserLoggedIn());
215 public void onFailure(Exception e) {
216 getView().showToastMessage(R.string.fetching_premium_failed);
220 public void onCancel() {
225 public Call<List<BookDetailsModel>> execute(BooksService service) {
226 return service.getPreview();
228 }, BooksService.class);
231 private void checkPremiumStatus() {
232 checkCall = client.call(new RestClientCallback<UserModel, UserService>() {
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);
244 public void onFailure(Exception e) {
249 public void onCancel() {
254 public Call<UserModel> execute(UserService service) {
255 return service.getUser();
257 }, UserService.class);