MangaChaptersPresenter.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package eu.kanade.mangafeed.presenter;
  2. import android.os.Bundle;
  3. import java.util.List;
  4. import javax.inject.Inject;
  5. import de.greenrobot.event.EventBus;
  6. import eu.kanade.mangafeed.data.helpers.DatabaseHelper;
  7. import eu.kanade.mangafeed.data.helpers.SourceManager;
  8. import eu.kanade.mangafeed.data.models.Chapter;
  9. import eu.kanade.mangafeed.data.models.Manga;
  10. import eu.kanade.mangafeed.events.ChapterCountEvent;
  11. import eu.kanade.mangafeed.events.SourceChapterEvent;
  12. import eu.kanade.mangafeed.sources.base.Source;
  13. import eu.kanade.mangafeed.ui.fragment.MangaChaptersFragment;
  14. import eu.kanade.mangafeed.util.EventBusHook;
  15. import eu.kanade.mangafeed.util.PostResult;
  16. import rx.Observable;
  17. import rx.Subscription;
  18. import rx.android.schedulers.AndroidSchedulers;
  19. import rx.schedulers.Schedulers;
  20. public class MangaChaptersPresenter extends BasePresenter<MangaChaptersFragment> {
  21. @Inject DatabaseHelper db;
  22. @Inject SourceManager sourceManager;
  23. private Manga manga;
  24. private Source source;
  25. private static final int DB_CHAPTERS = 1;
  26. private static final int ONLINE_CHAPTERS = 2;
  27. private Subscription menuOperationSubscription;
  28. @Override
  29. protected void onCreate(Bundle savedState) {
  30. super.onCreate(savedState);
  31. restartableLatestCache(DB_CHAPTERS,
  32. this::getDbChaptersObs,
  33. (view, chapters) -> {
  34. view.onNextChapters(chapters);
  35. EventBus.getDefault().postSticky( new ChapterCountEvent(chapters.size()) );
  36. }
  37. );
  38. restartableLatestCache(ONLINE_CHAPTERS,
  39. this::getOnlineChaptersObs,
  40. (view, result) -> view.onNextOnlineChapters()
  41. );
  42. }
  43. @Override
  44. protected void onTakeView(MangaChaptersFragment view) {
  45. super.onTakeView(view);
  46. registerForStickyEvents();
  47. }
  48. @Override
  49. protected void onDropView() {
  50. unregisterForEvents();
  51. super.onDropView();
  52. }
  53. @Override
  54. protected void onDestroy() {
  55. super.onDestroy();
  56. EventBus.getDefault().removeStickyEvent(ChapterCountEvent.class);
  57. }
  58. @EventBusHook
  59. public void onEventMainThread(Manga manga) {
  60. if (this.manga == null) {
  61. this.manga = manga;
  62. source = sourceManager.get(manga.source);
  63. start(DB_CHAPTERS);
  64. // Get chapters if it's an online source
  65. if (getView() != null && getView().isOnlineManga()) {
  66. refreshChapters();
  67. }
  68. }
  69. }
  70. public void refreshChapters() {
  71. if (getView() != null)
  72. getView().setSwipeRefreshing();
  73. start(ONLINE_CHAPTERS);
  74. }
  75. private Observable<List<Chapter>> getDbChaptersObs() {
  76. return db.getChapters(manga.id)
  77. .subscribeOn(Schedulers.io())
  78. .observeOn(AndroidSchedulers.mainThread());
  79. }
  80. private Observable<PostResult> getOnlineChaptersObs() {
  81. return source
  82. .pullChaptersFromNetwork(manga.url)
  83. .subscribeOn(Schedulers.io())
  84. .flatMap(chapters -> db.insertOrRemoveChapters(manga, chapters))
  85. .observeOn(AndroidSchedulers.mainThread());
  86. }
  87. public void onChapterClicked(Chapter chapter) {
  88. EventBus.getDefault().postSticky(new SourceChapterEvent(source, chapter));
  89. }
  90. public void markChaptersRead(Observable<Chapter> selectedChapters, boolean read) {
  91. if (menuOperationSubscription != null)
  92. remove(menuOperationSubscription);
  93. add(menuOperationSubscription = selectedChapters
  94. .subscribeOn(Schedulers.io())
  95. .map(chapter -> {
  96. chapter.read = read;
  97. return chapter;
  98. })
  99. .toList()
  100. .flatMap(db::insertChapters)
  101. .observeOn(AndroidSchedulers.mainThread())
  102. .subscribe(result -> {
  103. }));
  104. }
  105. }