mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Get rid of getView() calls in Chapters presenter. Minor changes in download manager
This commit is contained in:
		| @@ -36,11 +36,7 @@ public class Chapter { | ||||
|     @StorIOSQLiteColumn(name = ChapterTable.COLUMN_CHAPTER_NUMBER) | ||||
|     public float chapter_number; | ||||
|  | ||||
|     public int downloaded; | ||||
|  | ||||
|     public static final int UNKNOWN = 0; | ||||
|     public static final int NOT_DOWNLOADED = 1; | ||||
|     public static final int DOWNLOADED = 2; | ||||
|     public int status; | ||||
|  | ||||
|  | ||||
|     public Chapter() {} | ||||
|   | ||||
| @@ -20,11 +20,11 @@ import eu.kanade.mangafeed.data.database.models.Chapter; | ||||
| import eu.kanade.mangafeed.data.database.models.Manga; | ||||
| import eu.kanade.mangafeed.data.download.model.Download; | ||||
| import eu.kanade.mangafeed.data.download.model.DownloadQueue; | ||||
| import eu.kanade.mangafeed.data.source.model.Page; | ||||
| import eu.kanade.mangafeed.data.preference.PreferencesHelper; | ||||
| import eu.kanade.mangafeed.data.source.SourceManager; | ||||
| import eu.kanade.mangafeed.event.DownloadChaptersEvent; | ||||
| import eu.kanade.mangafeed.data.source.base.Source; | ||||
| import eu.kanade.mangafeed.data.source.model.Page; | ||||
| import eu.kanade.mangafeed.event.DownloadChaptersEvent; | ||||
| import eu.kanade.mangafeed.util.DiskUtils; | ||||
| import eu.kanade.mangafeed.util.DynamicConcurrentMergeOperator; | ||||
| import rx.Observable; | ||||
| @@ -112,15 +112,25 @@ public class DownloadManager { | ||||
|         for (Chapter chapter : event.getChapters()) { | ||||
|             Download download = new Download(source, manga, chapter); | ||||
|  | ||||
|             if (!isChapterDownloaded(download)) { | ||||
|             if (!prepareDownload(download)) { | ||||
|                 queue.add(download); | ||||
|                 if (isRunning) downloadsQueueSubject.onNext(download); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Check if a chapter is already downloaded | ||||
|     private boolean isChapterDownloaded(Download download) { | ||||
|     // Public method to checks if a chapter is downloaded | ||||
|     public boolean isChapterDownloaded(Source source, Manga manga, Chapter chapter) { | ||||
|         File directory = getAbsoluteChapterDirectory(source, manga, chapter); | ||||
|         if (!directory.exists()) | ||||
|             return false; | ||||
|  | ||||
|         List<Page> pages = getSavedPageList(source, manga, chapter); | ||||
|         return isChapterDownloaded(directory, pages); | ||||
|     } | ||||
|  | ||||
|     // Prepare the download. Returns true if the chapter is already downloaded | ||||
|     private boolean prepareDownload(Download download) { | ||||
|         // If the chapter is already queued, don't add it again | ||||
|         for (Download queuedDownload : queue.get()) { | ||||
|             if (download.chapter.id.equals(queuedDownload.chapter.id)) | ||||
| @@ -135,8 +145,7 @@ public class DownloadManager { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         // If the page list doesn't exist, the chapter isn't download (or maybe it's, | ||||
|         // but we consider it's not) | ||||
|         // If the page list doesn't exist, the chapter isn't downloaded | ||||
|         List<Page> savedPages = getSavedPageList(download); | ||||
|         if (savedPages == null) | ||||
|             return false; | ||||
| @@ -146,7 +155,12 @@ public class DownloadManager { | ||||
|  | ||||
|         // If the number of files matches the number of pages, the chapter is downloaded. | ||||
|         // We have the index file, so we check one file more | ||||
|         return savedPages.size() + 1 == download.directory.listFiles().length; | ||||
|         return isChapterDownloaded(download.directory, download.pages); | ||||
|     } | ||||
|  | ||||
|     // Check that all the images are downloaded | ||||
|     private boolean isChapterDownloaded(File directory, List<Page> pages) { | ||||
|         return pages != null && pages.size() + 1 == directory.listFiles().length; | ||||
|     } | ||||
|  | ||||
|     // Download the entire chapter | ||||
|   | ||||
| @@ -22,16 +22,18 @@ public class Download { | ||||
|  | ||||
|     private transient PublishSubject<Download> statusSubject; | ||||
|  | ||||
|     public static final int QUEUE = 0; | ||||
|     public static final int DOWNLOADING = 1; | ||||
|     public static final int DOWNLOADED = 2; | ||||
|     public static final int ERROR = 3; | ||||
|     public static final int NOT_DOWNLOADED = 0; | ||||
|     public static final int QUEUE = 1; | ||||
|     public static final int DOWNLOADING = 2; | ||||
|     public static final int DOWNLOADED = 3; | ||||
|     public static final int ERROR = 4; | ||||
|  | ||||
|  | ||||
|     public Download(Source source, Manga manga, Chapter chapter) { | ||||
|         this.source = source; | ||||
|         this.manga = manga; | ||||
|         this.chapter = chapter; | ||||
|         this.status = QUEUE; | ||||
|     } | ||||
|  | ||||
|     public int getStatus() { | ||||
|   | ||||
| @@ -4,13 +4,13 @@ import eu.kanade.mangafeed.data.database.models.Chapter; | ||||
| import eu.kanade.mangafeed.data.database.models.Manga; | ||||
| import eu.kanade.mangafeed.data.source.base.Source; | ||||
| 
 | ||||
| public class SourceMangaChapterEvent { | ||||
| public class ReaderEvent { | ||||
| 
 | ||||
|     private Source source; | ||||
|     private Manga manga; | ||||
|     private Chapter chapter; | ||||
| 
 | ||||
|     public SourceMangaChapterEvent(Source source, Manga manga, Chapter chapter) { | ||||
|     public ReaderEvent(Source source, Manga manga, Chapter chapter) { | ||||
|         this.source = source; | ||||
|         this.manga = manga; | ||||
|         this.chapter = chapter; | ||||
| @@ -92,7 +92,7 @@ public class MangaActivity extends BaseRxActivity<MangaPresenter> { | ||||
|         setToolbarTitle(manga.title); | ||||
|     } | ||||
|  | ||||
|     public boolean isOnlineManga() { | ||||
|     public boolean isCatalogueManga() { | ||||
|         return is_online; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -16,7 +16,6 @@ import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.CheckBox; | ||||
| import android.widget.ImageView; | ||||
| import android.widget.Toast; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| @@ -30,6 +29,7 @@ import eu.kanade.mangafeed.ui.base.fragment.BaseRxFragment; | ||||
| import eu.kanade.mangafeed.ui.decoration.DividerItemDecoration; | ||||
| import eu.kanade.mangafeed.ui.manga.MangaActivity; | ||||
| import eu.kanade.mangafeed.ui.reader.ReaderActivity; | ||||
| import eu.kanade.mangafeed.util.ToastUtil; | ||||
| import nucleus.factory.RequiresPresenter; | ||||
| import rx.Observable; | ||||
|  | ||||
| @@ -58,6 +58,7 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen | ||||
|     public void onCreate(Bundle savedState) { | ||||
|         super.onCreate(savedState); | ||||
|         setHasOptionsMenu(true); | ||||
|         getPresenter().setIsCatalogueManga(isCatalogueManga()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -67,21 +68,29 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen | ||||
|         View view = inflater.inflate(R.layout.fragment_manga_chapters, container, false); | ||||
|         ButterKnife.bind(this, view); | ||||
|  | ||||
|         // Init RecyclerView and adapter | ||||
|         chapters.setLayoutManager(new LinearLayoutManager(getActivity())); | ||||
|         chapters.addItemDecoration(new DividerItemDecoration(ContextCompat.getDrawable(this.getContext(), R.drawable.line_divider))); | ||||
|         createAdapter(); | ||||
|         setSwipeRefreshListener(); | ||||
|         adapter = new ChaptersAdapter(this); | ||||
|         chapters.setAdapter(adapter); | ||||
|  | ||||
|         readCb.setOnCheckedChangeListener((arg, isCheked) -> getPresenter().setReadFilter(isCheked)); | ||||
|         // Set initial values | ||||
|         setReadFilter(getPresenter().getReadFilter()); | ||||
|         setSortIcon(getPresenter().getSortOrder()); | ||||
|  | ||||
|         // Init listeners | ||||
|         swipeRefresh.setOnRefreshListener(this::onFetchChapters); | ||||
|         readCb.setOnCheckedChangeListener((arg, isChecked) -> getPresenter().setReadFilter(isChecked)); | ||||
|         sortBtn.setOnClickListener(v -> getPresenter().revertSortOrder()); | ||||
|         nextUnreadBtn.setOnClickListener(v -> { | ||||
|             Chapter chapter = getPresenter().getNextUnreadChapter(); | ||||
|             if (chapter != null) { | ||||
|                 openChapter(chapter); | ||||
|             } else { | ||||
|                 Toast.makeText(getContext(), R.string.no_next_chapter, Toast.LENGTH_SHORT).show(); | ||||
|                 ToastUtil.showShort(getContext(), R.string.no_next_chapter); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         return view; | ||||
|     } | ||||
|  | ||||
| @@ -89,49 +98,38 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen | ||||
|     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { | ||||
|         inflater.inflate(R.menu.chapters, menu); | ||||
|         super.onCreateOptionsMenu(menu, inflater); | ||||
|  | ||||
|         getPresenter().initSortIcon(); | ||||
|         getPresenter().initReadCb(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(MenuItem item) { | ||||
|         switch (item.getItemId()) { | ||||
|             case R.id.action_refresh: | ||||
|                 getPresenter().refreshChapters(); | ||||
|                 onFetchChapters(); | ||||
|                 break; | ||||
|         } | ||||
|         return super.onOptionsItemSelected(item); | ||||
|     } | ||||
|  | ||||
|     private void createAdapter() { | ||||
|         adapter = new ChaptersAdapter(this); | ||||
|         chapters.setAdapter(adapter); | ||||
|     } | ||||
|  | ||||
|     private void setSwipeRefreshListener() { | ||||
|         swipeRefresh.setOnRefreshListener(() -> getPresenter().refreshChapters()); | ||||
|     } | ||||
|  | ||||
|     public void onNextChapters(List<Chapter> chapters) { | ||||
|         adapter.setItems(chapters); | ||||
|         closeActionMode(); | ||||
|         adapter.setItems(chapters); | ||||
|     } | ||||
|  | ||||
|     public void onNextOnlineChapters() { | ||||
|     public void onFetchChapters() { | ||||
|         swipeRefresh.setRefreshing(true); | ||||
|         getPresenter().fetchChapters(); | ||||
|     } | ||||
|  | ||||
|     public void onFetchChaptersFinish() { | ||||
|         swipeRefresh.setRefreshing(false); | ||||
|     } | ||||
|  | ||||
|     public void setSwipeRefreshing() { | ||||
|         swipeRefresh.setRefreshing(true); | ||||
|     } | ||||
|  | ||||
|     public boolean isOnlineManga() { | ||||
|         return ((MangaActivity) getActivity()).isOnlineManga(); | ||||
|     public boolean isCatalogueManga() { | ||||
|         return ((MangaActivity) getActivity()).isCatalogueManga(); | ||||
|     } | ||||
|  | ||||
|     protected void openChapter(Chapter chapter) { | ||||
|         getPresenter().onChapterClicked(chapter); | ||||
|         getPresenter().onOpenChapter(chapter); | ||||
|         Intent intent = ReaderActivity.newIntent(getActivity()); | ||||
|         startActivity(intent); | ||||
|     } | ||||
|   | ||||
| @@ -15,6 +15,7 @@ import butterknife.Bind; | ||||
| import butterknife.ButterKnife; | ||||
| import eu.kanade.mangafeed.R; | ||||
| import eu.kanade.mangafeed.data.database.models.Chapter; | ||||
| import eu.kanade.mangafeed.data.download.model.Download; | ||||
| import rx.Observable; | ||||
|  | ||||
| public class ChaptersHolder extends RecyclerView.ViewHolder implements | ||||
| @@ -61,12 +62,9 @@ public class ChaptersHolder extends RecyclerView.ViewHolder implements | ||||
|             pages.setText(""); | ||||
|         } | ||||
|  | ||||
|         if (chapter.downloaded == Chapter.UNKNOWN) { | ||||
|             adapter.getChaptersFragment().getPresenter().checkIsChapterDownloaded(chapter); | ||||
|         } | ||||
|         if (chapter.downloaded == Chapter.DOWNLOADED) { | ||||
|         if (chapter.status == Download.DOWNLOADED) { | ||||
|             downloadText.setVisibility(View.VISIBLE); | ||||
|         } else if (chapter.downloaded == Chapter.NOT_DOWNLOADED) { | ||||
|         } else if (chapter.status == Download.NOT_DOWNLOADED) { | ||||
|             downloadText.setVisibility(View.INVISIBLE); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,6 @@ package eu.kanade.mangafeed.ui.manga.chapter; | ||||
|  | ||||
| import android.os.Bundle; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.List; | ||||
|  | ||||
| import javax.inject.Inject; | ||||
| @@ -12,13 +11,13 @@ import eu.kanade.mangafeed.data.database.DatabaseHelper; | ||||
| import eu.kanade.mangafeed.data.database.models.Chapter; | ||||
| import eu.kanade.mangafeed.data.database.models.Manga; | ||||
| import eu.kanade.mangafeed.data.download.DownloadManager; | ||||
| import eu.kanade.mangafeed.data.download.model.Download; | ||||
| import eu.kanade.mangafeed.data.preference.PreferencesHelper; | ||||
| import eu.kanade.mangafeed.data.source.SourceManager; | ||||
| import eu.kanade.mangafeed.data.source.base.Source; | ||||
| import eu.kanade.mangafeed.data.source.model.Page; | ||||
| import eu.kanade.mangafeed.event.ChapterCountEvent; | ||||
| import eu.kanade.mangafeed.event.DownloadChaptersEvent; | ||||
| import eu.kanade.mangafeed.event.SourceMangaChapterEvent; | ||||
| import eu.kanade.mangafeed.event.ReaderEvent; | ||||
| import eu.kanade.mangafeed.ui.base.presenter.BasePresenter; | ||||
| import eu.kanade.mangafeed.util.EventBusHook; | ||||
| import eu.kanade.mangafeed.util.PostResult; | ||||
| @@ -36,11 +35,12 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> { | ||||
|  | ||||
|     private Manga manga; | ||||
|     private Source source; | ||||
|     private boolean isCatalogueManga; | ||||
|     private boolean sortOrderAToZ = true; | ||||
|     private boolean onlyUnread = true; | ||||
|  | ||||
|     private static final int DB_CHAPTERS = 1; | ||||
|     private static final int ONLINE_CHAPTERS = 2; | ||||
|     private static final int FETCH_CHAPTERS = 2; | ||||
|  | ||||
|     private Subscription markReadSubscription; | ||||
|     private Subscription downloadSubscription; | ||||
| @@ -58,9 +58,9 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> { | ||||
|                 } | ||||
|         ); | ||||
|  | ||||
|         restartableLatestCache(ONLINE_CHAPTERS, | ||||
|         restartableLatestCache(FETCH_CHAPTERS, | ||||
|                 this::getOnlineChaptersObs, | ||||
|                 (view, result) -> view.onNextOnlineChapters() | ||||
|                 (view, result) -> view.onFetchChaptersFinish() | ||||
|         ); | ||||
|     } | ||||
|  | ||||
| @@ -90,21 +90,19 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> { | ||||
|             start(DB_CHAPTERS); | ||||
|  | ||||
|             // Get chapters if it's an online source | ||||
|             if (getView() != null && getView().isOnlineManga()) { | ||||
|                 refreshChapters(); | ||||
|             if (isCatalogueManga) { | ||||
|                 fetchChapters(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void refreshChapters() { | ||||
|         if (getView() != null) | ||||
|             getView().setSwipeRefreshing(); | ||||
|  | ||||
|         start(ONLINE_CHAPTERS); | ||||
|     public void fetchChapters() { | ||||
|         start(FETCH_CHAPTERS); | ||||
|     } | ||||
|  | ||||
|     private Observable<List<Chapter>> getDbChaptersObs() { | ||||
|         return db.getChapters(manga.id, sortOrderAToZ, onlyUnread).createObservable() | ||||
|                 .doOnNext(this::checkChaptersStatus) | ||||
|                 .subscribeOn(Schedulers.io()) | ||||
|                 .observeOn(AndroidSchedulers.mainThread()); | ||||
|     } | ||||
| @@ -117,13 +115,13 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> { | ||||
|                 .observeOn(AndroidSchedulers.mainThread()); | ||||
|     } | ||||
|  | ||||
|     public void onChapterClicked(Chapter chapter) { | ||||
|         EventBus.getDefault().postSticky(new SourceMangaChapterEvent(source, manga, chapter)); | ||||
|     public void onOpenChapter(Chapter chapter) { | ||||
|         EventBus.getDefault().postSticky(new ReaderEvent(source, manga, chapter)); | ||||
|     } | ||||
|  | ||||
|     public Chapter getNextUnreadChapter() { | ||||
|         List<Chapter> chapters = db.getNextUnreadChapter(manga).executeAsBlocking(); | ||||
|         if(chapters.size() < 1){ | ||||
|         if (chapters.isEmpty()) { | ||||
|             return null; | ||||
|         } | ||||
|         return chapters.get(0); | ||||
| @@ -159,42 +157,54 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> { | ||||
|                 .doOnCompleted(() -> remove(deleteSubscription)) | ||||
|                 .subscribe(chapter -> { | ||||
|                     downloadManager.deleteChapter(source, manga, chapter); | ||||
|                     chapter.downloaded = Chapter.NOT_DOWNLOADED; | ||||
|                     chapter.status = Download.NOT_DOWNLOADED; | ||||
|                 }); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     private void checkChaptersStatus(List<Chapter> chapters) { | ||||
|         for (Chapter chapter : chapters) { | ||||
|             checkIsChapterDownloaded(chapter); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public void checkIsChapterDownloaded(Chapter chapter) { | ||||
|         File dir = downloadManager.getAbsoluteChapterDirectory(source, manga, chapter); | ||||
|         List<Page> pageList = downloadManager.getSavedPageList(source, manga, chapter); | ||||
|         for (Download download : downloadManager.getQueue().get()) { | ||||
|             if (chapter.id.equals(download.chapter.id)) { | ||||
|                 chapter.status = download.getStatus(); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (pageList != null && pageList.size() + 1 == dir.listFiles().length) { | ||||
|             chapter.downloaded = Chapter.DOWNLOADED; | ||||
|         if (downloadManager.isChapterDownloaded(source, manga, chapter)) { | ||||
|             chapter.status = Download.DOWNLOADED; | ||||
|         } else { | ||||
|             chapter.downloaded = Chapter.NOT_DOWNLOADED; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void initSortIcon() { | ||||
|         if (getView() != null) { | ||||
|             getView().setSortIcon(sortOrderAToZ);//TODO manga.chapter_order | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void initReadCb() { | ||||
|         if (getView() != null) { | ||||
|             getView().setReadFilter(onlyUnread);//TODO do we need save filter for manga? | ||||
|             chapter.status = Download.NOT_DOWNLOADED; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void revertSortOrder() { | ||||
|         //TODO manga.chapter_order | ||||
|         sortOrderAToZ = !sortOrderAToZ; | ||||
|         initSortIcon(); | ||||
|         start(DB_CHAPTERS); | ||||
|     } | ||||
|  | ||||
|     public void setReadFilter(boolean onlyUnread) { | ||||
|         //TODO do we need save filter for manga? | ||||
|         this.onlyUnread = onlyUnread; | ||||
|         initReadCb(); | ||||
|         start(DB_CHAPTERS); | ||||
|     } | ||||
|  | ||||
|     public void setIsCatalogueManga(boolean value) { | ||||
|         isCatalogueManga = value; | ||||
|     } | ||||
|  | ||||
|     public boolean getSortOrder() { | ||||
|         return sortOrderAToZ; | ||||
|     } | ||||
|  | ||||
|     public boolean getReadFilter() { | ||||
|         return onlyUnread; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -20,7 +20,7 @@ import eu.kanade.mangafeed.data.preference.PreferencesHelper; | ||||
| import eu.kanade.mangafeed.data.source.base.Source; | ||||
| import eu.kanade.mangafeed.data.source.model.Page; | ||||
| import eu.kanade.mangafeed.event.RetryPageEvent; | ||||
| import eu.kanade.mangafeed.event.SourceMangaChapterEvent; | ||||
| import eu.kanade.mangafeed.event.ReaderEvent; | ||||
| import eu.kanade.mangafeed.event.UpdateChapterSyncEvent; | ||||
| import eu.kanade.mangafeed.ui.base.presenter.BasePresenter; | ||||
| import eu.kanade.mangafeed.util.EventBusHook; | ||||
| @@ -118,7 +118,7 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|     } | ||||
|  | ||||
|     @EventBusHook | ||||
|     public void onEventMainThread(SourceMangaChapterEvent event) { | ||||
|     public void onEventMainThread(ReaderEvent event) { | ||||
|         EventBus.getDefault().removeStickyEvent(event); | ||||
|         source = event.getSource(); | ||||
|         manga = event.getManga(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user