LibraryPresenter.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package eu.kanade.mangafeed.ui.library;
  2. import android.os.Bundle;
  3. import android.util.Pair;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.Map;
  7. import javax.inject.Inject;
  8. import de.greenrobot.event.EventBus;
  9. import eu.kanade.mangafeed.data.cache.CoverCache;
  10. import eu.kanade.mangafeed.data.database.DatabaseHelper;
  11. import eu.kanade.mangafeed.data.database.models.Category;
  12. import eu.kanade.mangafeed.data.database.models.Manga;
  13. import eu.kanade.mangafeed.data.database.models.MangaCategory;
  14. import eu.kanade.mangafeed.data.preference.PreferencesHelper;
  15. import eu.kanade.mangafeed.data.source.SourceManager;
  16. import eu.kanade.mangafeed.event.LibraryMangasEvent;
  17. import eu.kanade.mangafeed.ui.base.presenter.BasePresenter;
  18. import rx.Observable;
  19. import rx.android.schedulers.AndroidSchedulers;
  20. public class LibraryPresenter extends BasePresenter<LibraryFragment> {
  21. @Inject DatabaseHelper db;
  22. @Inject PreferencesHelper preferences;
  23. @Inject CoverCache coverCache;
  24. @Inject SourceManager sourceManager;
  25. protected List<Category> categories;
  26. protected List<Manga> selectedMangas;
  27. private static final int GET_LIBRARY = 1;
  28. @Override
  29. protected void onCreate(Bundle savedState) {
  30. super.onCreate(savedState);
  31. selectedMangas = new ArrayList<>();
  32. restartableLatestCache(GET_LIBRARY,
  33. this::getLibraryObservable,
  34. (view, pair) -> view.onNextLibraryUpdate(pair.first, pair.second));
  35. start(GET_LIBRARY);
  36. }
  37. @Override
  38. protected void onDestroy() {
  39. EventBus.getDefault().removeStickyEvent(LibraryMangasEvent.class);
  40. super.onDestroy();
  41. }
  42. @Override
  43. protected void onTakeView(LibraryFragment libraryFragment) {
  44. super.onTakeView(libraryFragment);
  45. if (!isSubscribed(GET_LIBRARY)) {
  46. start(GET_LIBRARY);
  47. }
  48. }
  49. private Observable<Pair<List<Category>, Map<Integer, List<Manga>>>> getLibraryObservable() {
  50. return Observable.combineLatest(getCategoriesObservable(), getLibraryMangasObservable(),
  51. Pair::create)
  52. .observeOn(AndroidSchedulers.mainThread());
  53. }
  54. private Observable<List<Category>> getCategoriesObservable() {
  55. return db.getCategories().createObservable()
  56. .doOnNext(categories -> this.categories = categories);
  57. }
  58. private Observable<Map<Integer, List<Manga>>> getLibraryMangasObservable() {
  59. return db.getLibraryMangas().createObservable()
  60. .flatMap(mangas -> Observable.from(mangas)
  61. .groupBy(manga -> manga.category)
  62. .flatMap(group -> group.toList()
  63. .map(list -> Pair.create(group.getKey(), list)))
  64. .toMap(pair -> pair.first, pair -> pair.second));
  65. }
  66. public void onOpenManga(Manga manga) {
  67. // Avoid further db updates for the library when it's not needed
  68. stop(GET_LIBRARY);
  69. }
  70. public void setSelection(Manga manga, boolean selected) {
  71. if (selected) {
  72. selectedMangas.add(manga);
  73. } else {
  74. selectedMangas.remove(manga);
  75. }
  76. }
  77. public String[] getCategoriesNames() {
  78. int count = categories.size();
  79. String[] names = new String[count];
  80. for (int i = 0; i < count; i++) {
  81. names[i] = categories.get(i).name;
  82. }
  83. return names;
  84. }
  85. public void deleteMangas() {
  86. for (Manga manga : selectedMangas) {
  87. manga.favorite = false;
  88. }
  89. db.insertMangas(selectedMangas).executeAsBlocking();
  90. }
  91. public void moveMangasToCategories(Integer[] positions, List<Manga> mangas) {
  92. List<Category> categoriesToAdd = new ArrayList<>();
  93. for (Integer index : positions) {
  94. categoriesToAdd.add(categories.get(index));
  95. }
  96. moveMangasToCategories(categoriesToAdd, mangas);
  97. }
  98. public void moveMangasToCategories(List<Category> categories, List<Manga> mangas) {
  99. List<MangaCategory> mc = new ArrayList<>();
  100. for (Manga manga : mangas) {
  101. for (Category cat : categories) {
  102. mc.add(MangaCategory.create(manga, cat));
  103. }
  104. }
  105. db.setMangaCategories(mc, mangas);
  106. }
  107. }