Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / view / library / LibraryPresenter.java
diff --git a/Android/app/src/main/java/com/moiseum/wolnelektury/view/library/LibraryPresenter.java b/Android/app/src/main/java/com/moiseum/wolnelektury/view/library/LibraryPresenter.java
new file mode 100644 (file)
index 0000000..88f9b8b
--- /dev/null
@@ -0,0 +1,245 @@
+package com.moiseum.wolnelektury.view.library;
+
+import android.os.Bundle;
+
+import com.moiseum.wolnelektury.base.DataObserver;
+import com.moiseum.wolnelektury.base.WLApplication;
+import com.moiseum.wolnelektury.base.mvp.FragmentPresenter;
+import com.moiseum.wolnelektury.connection.RestClient;
+import com.moiseum.wolnelektury.connection.RestClientCallback;
+import com.moiseum.wolnelektury.connection.models.BookDetailsModel;
+import com.moiseum.wolnelektury.connection.models.BookModel;
+import com.moiseum.wolnelektury.connection.models.ReadingStateModel;
+import com.moiseum.wolnelektury.connection.services.BooksService;
+import com.moiseum.wolnelektury.events.LoggedInEvent;
+import com.moiseum.wolnelektury.storage.BookStorage;
+import com.moiseum.wolnelektury.utils.SharedPreferencesUtils;
+import com.moiseum.wolnelektury.view.book.BookType;
+import com.moiseum.wolnelektury.view.book.list.NewestBooksDataProvider;
+import com.moiseum.wolnelektury.view.book.list.ReadingStateDataProvider;
+import com.moiseum.wolnelektury.view.book.list.RecommendedBooksDataProvider;
+import com.moiseum.wolnelektury.view.main.MainActivity;
+import com.moiseum.wolnelektury.view.main.NavigationElement;
+import com.moiseum.wolnelektury.view.main.events.PremiumStatusEvent;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.util.List;
+
+import retrofit2.Call;
+
+/**
+ * @author golonkos
+ */
+class LibraryPresenter extends FragmentPresenter<LibraryView> {
+
+       private static final String TAG = LibraryPresenter.class.getSimpleName();
+       private final NewestBooksDataProvider newestBooksDataProvider;
+       private final RecommendedBooksDataProvider recommendedBooksDataProvider;
+       private final ReadingStateDataProvider nowReadingBooksDataProvider;
+       private BookDetailsModel premiereBook;
+       private Call currentCall;
+       private RestClient client = WLApplication.getInstance().getRestClient();
+
+       private SharedPreferencesUtils preferences = WLApplication.getInstance().getPreferences();
+
+       LibraryPresenter(LibraryView view) {
+               super(view);
+               newestBooksDataProvider = new NewestBooksDataProvider();
+               newestBooksDataProvider.setDataObserver(new NewestDataObserver());
+
+               recommendedBooksDataProvider = new RecommendedBooksDataProvider();
+               recommendedBooksDataProvider.setDataObserver(new RecommendedDataObserver());
+
+               nowReadingBooksDataProvider = new ReadingStateDataProvider(ReadingStateModel.ReadingState.STATE_READING);
+               nowReadingBooksDataProvider.setDataObserver(new NowReadingDataObserver());
+       }
+
+       @Override
+       public void onCreate(Bundle savedInstanceState) {
+               super.onCreate(savedInstanceState);
+               EventBus.getDefault().register(this);
+       }
+
+       @Override
+       public void onViewCreated(Bundle savedInstanceState) {
+               super.onViewCreated(savedInstanceState);
+               newestBooksDataProvider.load(null);
+               recommendedBooksDataProvider.load(null);
+               if (preferences.isUserLoggedIn()) {
+                       getView().setNowReadingVisibility(true);
+                       nowReadingBooksDataProvider.load(null);
+               }
+               fetchHeader();
+       }
+
+       @Override
+       public void onResume() {
+               super.onResume();
+               getView().showBecomeAFriendHeader(preferences.isUserPremium());
+       }
+
+       @Override
+       public void onDestroy() {
+               super.onDestroy();
+               newestBooksDataProvider.cancel();
+               recommendedBooksDataProvider.cancel();
+               nowReadingBooksDataProvider.cancel();
+               if (currentCall != null) {
+                       currentCall.cancel();
+               }
+               EventBus.getDefault().unregister(this);
+       }
+
+       void onNowReadingSeeAllClicked() {
+               EventBus.getDefault().post(new MainActivity.ChangeNavigationEvent(NavigationElement.NOW_READING));
+       }
+
+       void onBookClicked(BookModel book) {
+               getView().openBookDetailsView(book.getSlug(), BookType.TYPE_DEFAULT);
+       }
+
+       void reloadNewest() {
+               newestBooksDataProvider.load(null);
+       }
+
+       void reloadRecommended() {
+               recommendedBooksDataProvider.load(null);
+       }
+
+       void reloadNowReading() {
+               nowReadingBooksDataProvider.load(null);
+       }
+
+       @SuppressWarnings("unused")
+       @Subscribe(threadMode = ThreadMode.MAIN)
+       public void onBookAdded(BookStorage.BookAddedEvent event) {
+               if (preferences.isUserLoggedIn()) {
+                       nowReadingBooksDataProvider.load(null);
+               }
+       }
+
+       @SuppressWarnings("unused")
+       @Subscribe(threadMode = ThreadMode.MAIN)
+       public void onBookDeleted(BookStorage.BookDeletedEvent event) {
+               if (preferences.isUserLoggedIn()) {
+                       nowReadingBooksDataProvider.load(null);
+               }
+       }
+
+       @SuppressWarnings("unused")
+       @Subscribe(threadMode = ThreadMode.MAIN)
+       public void onPremiumChanged(PremiumStatusEvent event) {
+               getView().showBecomeAFriendHeader(event.isPremium());
+       }
+
+       @SuppressWarnings("unused")
+       @Subscribe(threadMode = ThreadMode.MAIN)
+       public void onLoggedIn(LoggedInEvent event) {
+               getView().showBecomeAFriendHeader(preferences.isUserPremium());
+               getView().setNowReadingVisibility(true);
+               nowReadingBooksDataProvider.load(null);
+       }
+
+       void onPremiereHeaderClicked() {
+               if (premiereBook != null) {
+                       getView().openBookDetailsView(premiereBook.getSlug(), BookType.TYPE_PREMIUM);
+               }
+       }
+
+       void fetchHeader() {
+               getView().setProgressContainerVisible(true);
+               getView().setHeaderProgressVisible(true);
+               currentCall = client.call(new RestClientCallback<List<BookDetailsModel>, BooksService>() {
+                       @Override
+                       public void onSuccess(List<BookDetailsModel> data) {
+                               getView().setHeaderProgressVisible(false);
+                               if (data.size() > 0) {
+                                       premiereBook = data.get(0);
+                                       getView().initHeader(premiereBook);
+                                       getView().setProgressContainerVisible(false);
+                               } else {
+                                       getView().showHeaderEmpty(preferences.isUserLoggedIn());
+                               }
+                       }
+
+                       @Override
+                       public void onFailure(Exception e) {
+                               getView().showHeaderError();
+                       }
+
+                       @Override
+                       public void onCancel() {
+                               // nop.
+                       }
+
+                       @Override
+                       public Call<List<BookDetailsModel>> execute(BooksService service) {
+                               return service.getPreview();
+                       }
+               }, BooksService.class);
+       }
+
+
+       private class NewestDataObserver implements DataObserver<List<BookModel>> {
+
+               @Override
+               public void onLoadStarted() {
+                       getView().setNewestProgressVisible(true);
+               }
+
+               @Override
+               public void onLoadSuccess(List<BookModel> data) {
+                       getView().setNewestProgressVisible(false);
+                       getView().setNewest(data);
+               }
+
+               @Override
+               public void onLoadFailed(Exception e) {
+                       getView().setNewestProgressVisible(false);
+                       getView().showNewestError(e);
+               }
+       }
+
+       private class RecommendedDataObserver implements DataObserver<List<BookModel>> {
+
+               @Override
+               public void onLoadStarted() {
+                       getView().setRecommendedProgressVisible(true);
+               }
+
+               @Override
+               public void onLoadSuccess(List<BookModel> data) {
+                       getView().setRecommendedProgressVisible(false);
+                       getView().setRecommended(data);
+               }
+
+               @Override
+               public void onLoadFailed(Exception e) {
+                       getView().setRecommendedProgressVisible(false);
+                       getView().showRecommendedError(e);
+               }
+       }
+
+       private class NowReadingDataObserver implements DataObserver<List<BookModel>> {
+
+               @Override
+               public void onLoadStarted() {
+                       getView().setNowReadingProgressVisible(true);
+               }
+
+               @Override
+               public void onLoadSuccess(List<BookModel> data) {
+                       getView().setNowReadingProgressVisible(false);
+                       getView().setNowReading(data);
+               }
+
+               @Override
+               public void onLoadFailed(Exception e) {
+                       getView().setNowReadingProgressVisible(false);
+                       getView().showNowReadingError(e);
+               }
+       }
+}