Initial download queue fragment. Update progress working
This commit is contained in:
parent
3b9f4cb6f1
commit
999cc0df6e
@ -12,11 +12,11 @@ import java.io.FileOutputStream;
|
|||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import eu.kanade.mangafeed.data.models.Chapter;
|
import eu.kanade.mangafeed.data.models.Chapter;
|
||||||
import eu.kanade.mangafeed.data.models.Download;
|
import eu.kanade.mangafeed.data.models.Download;
|
||||||
|
import eu.kanade.mangafeed.data.models.DownloadQueue;
|
||||||
import eu.kanade.mangafeed.data.models.Manga;
|
import eu.kanade.mangafeed.data.models.Manga;
|
||||||
import eu.kanade.mangafeed.data.models.Page;
|
import eu.kanade.mangafeed.data.models.Page;
|
||||||
import eu.kanade.mangafeed.events.DownloadChapterEvent;
|
import eu.kanade.mangafeed.events.DownloadChapterEvent;
|
||||||
@ -37,7 +37,9 @@ public class DownloadManager {
|
|||||||
private PreferencesHelper preferences;
|
private PreferencesHelper preferences;
|
||||||
private Gson gson;
|
private Gson gson;
|
||||||
|
|
||||||
private List<Download> queue;
|
private DownloadQueue queue;
|
||||||
|
|
||||||
|
public static final String PAGE_LIST_FILE = "index.json";
|
||||||
|
|
||||||
public DownloadManager(Context context, SourceManager sourceManager, PreferencesHelper preferences) {
|
public DownloadManager(Context context, SourceManager sourceManager, PreferencesHelper preferences) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
@ -45,7 +47,7 @@ public class DownloadManager {
|
|||||||
this.preferences = preferences;
|
this.preferences = preferences;
|
||||||
this.gson = new Gson();
|
this.gson = new Gson();
|
||||||
|
|
||||||
queue = new ArrayList<>();
|
queue = new DownloadQueue();
|
||||||
|
|
||||||
initializeDownloadSubscription();
|
initializeDownloadSubscription();
|
||||||
}
|
}
|
||||||
@ -78,7 +80,7 @@ public class DownloadManager {
|
|||||||
final Source source = sourceManager.get(event.getManga().source);
|
final Source source = sourceManager.get(event.getManga().source);
|
||||||
|
|
||||||
// If the chapter is already queued, don't add it again
|
// If the chapter is already queued, don't add it again
|
||||||
for (Download download : queue) {
|
for (Download download : queue.get()) {
|
||||||
if (download.chapter.id == event.getChapter().id)
|
if (download.chapter.id == event.getChapter().id)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -119,7 +121,10 @@ public class DownloadManager {
|
|||||||
.pullPageListFromNetwork(download.chapter.url)
|
.pullPageListFromNetwork(download.chapter.url)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
// Add resulting pages to download object
|
// Add resulting pages to download object
|
||||||
.doOnNext(pages -> download.pages = pages)
|
.doOnNext(pages -> {
|
||||||
|
download.pages = pages;
|
||||||
|
download.setStatus(Download.DOWNLOADING);
|
||||||
|
})
|
||||||
// Get all the URLs to the source images, fetch pages if necessary
|
// Get all the URLs to the source images, fetch pages if necessary
|
||||||
.flatMap(pageList -> Observable.merge(
|
.flatMap(pageList -> Observable.merge(
|
||||||
Observable.from(pageList).filter(page -> page.getImageUrl() != null),
|
Observable.from(pageList).filter(page -> page.getImageUrl() != null),
|
||||||
@ -127,7 +132,7 @@ public class DownloadManager {
|
|||||||
// Start downloading images, consider we can have downloaded images already
|
// Start downloading images, consider we can have downloaded images already
|
||||||
.concatMap(page -> getDownloadedImage(page, download.source, download.directory))
|
.concatMap(page -> getDownloadedImage(page, download.source, download.directory))
|
||||||
// Remove from the queue
|
// Remove from the queue
|
||||||
.doOnCompleted(() -> removeFromQueue(download));
|
.doOnCompleted(() -> onChapterDownloaded(download));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get downloaded image if exists, otherwise download it with the method below
|
// Get downloaded image if exists, otherwise download it with the method below
|
||||||
@ -179,15 +184,15 @@ public class DownloadManager {
|
|||||||
return imagePath.exists() && !imagePath.isDirectory();
|
return imagePath.exists() && !imagePath.isDirectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeFromQueue(final Download download) {
|
private void onChapterDownloaded(final Download download) {
|
||||||
|
download.setStatus(Download.DOWNLOADED);
|
||||||
savePageList(download.source, download.manga, download.chapter, download.pages);
|
savePageList(download.source, download.manga, download.chapter, download.pages);
|
||||||
queue.remove(download);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the page list from the chapter's directory if it exists, null otherwise
|
// Return the page list from the chapter's directory if it exists, null otherwise
|
||||||
public List<Page> getSavedPageList(Source source, Manga manga, Chapter chapter) {
|
public List<Page> getSavedPageList(Source source, Manga manga, Chapter chapter) {
|
||||||
File chapterDir = getAbsoluteChapterDirectory(source, manga, chapter);
|
File chapterDir = getAbsoluteChapterDirectory(source, manga, chapter);
|
||||||
File pagesFile = new File(chapterDir, "index.json");
|
File pagesFile = new File(chapterDir, PAGE_LIST_FILE);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
JsonReader reader = new JsonReader(new FileReader(pagesFile.getAbsolutePath()));
|
JsonReader reader = new JsonReader(new FileReader(pagesFile.getAbsolutePath()));
|
||||||
@ -202,7 +207,7 @@ public class DownloadManager {
|
|||||||
// Save the page list to the chapter's directory
|
// Save the page list to the chapter's directory
|
||||||
public void savePageList(Source source, Manga manga, Chapter chapter, List<Page> pages) {
|
public void savePageList(Source source, Manga manga, Chapter chapter, List<Page> pages) {
|
||||||
File chapterDir = getAbsoluteChapterDirectory(source, manga, chapter);
|
File chapterDir = getAbsoluteChapterDirectory(source, manga, chapter);
|
||||||
File pagesFile = new File(chapterDir, "index.json");
|
File pagesFile = new File(chapterDir, PAGE_LIST_FILE);
|
||||||
|
|
||||||
FileOutputStream out;
|
FileOutputStream out;
|
||||||
try {
|
try {
|
||||||
@ -230,4 +235,8 @@ public class DownloadManager {
|
|||||||
File path = getAbsoluteChapterDirectory(source, manga, chapter);
|
File path = getAbsoluteChapterDirectory(source, manga, chapter);
|
||||||
DiskUtils.deleteFiles(path);
|
DiskUtils.deleteFiles(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DownloadQueue getQueue() {
|
||||||
|
return queue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import java.io.File;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import eu.kanade.mangafeed.sources.base.Source;
|
import eu.kanade.mangafeed.sources.base.Source;
|
||||||
|
import rx.subjects.PublishSubject;
|
||||||
|
|
||||||
public class Download {
|
public class Download {
|
||||||
public Source source;
|
public Source source;
|
||||||
@ -12,9 +13,38 @@ public class Download {
|
|||||||
public List<Page> pages;
|
public List<Page> pages;
|
||||||
public File directory;
|
public File directory;
|
||||||
|
|
||||||
|
public transient volatile int totalProgress;
|
||||||
|
private transient volatile int status;
|
||||||
|
|
||||||
|
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 Download(Source source, Manga manga, Chapter chapter) {
|
public Download(Source source, Manga manga, Chapter chapter) {
|
||||||
this.source = source;
|
this.source = source;
|
||||||
this.manga = manga;
|
this.manga = manga;
|
||||||
this.chapter = chapter;
|
this.chapter = chapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(int status) {
|
||||||
|
this.status = status;
|
||||||
|
notifyStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatusSubject(PublishSubject<Download> subject) {
|
||||||
|
this.statusSubject = subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void notifyStatus() {
|
||||||
|
if (statusSubject != null)
|
||||||
|
statusSubject.onNext(this);
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package eu.kanade.mangafeed.data.models;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import rx.Observable;
|
||||||
|
import rx.subjects.PublishSubject;
|
||||||
|
|
||||||
|
public class DownloadQueue {
|
||||||
|
|
||||||
|
private List<Download> queue;
|
||||||
|
private PublishSubject<Download> statusSubject;
|
||||||
|
|
||||||
|
public DownloadQueue() {
|
||||||
|
queue = new ArrayList<>();
|
||||||
|
statusSubject = PublishSubject.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(Download download) {
|
||||||
|
download.setStatusSubject(statusSubject);
|
||||||
|
queue.add(download);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove(Download download) {
|
||||||
|
queue.remove(download);
|
||||||
|
download.setStatusSubject(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Download> get() {
|
||||||
|
return queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Observable<Download> getActiveDownloads() {
|
||||||
|
return Observable.from(queue)
|
||||||
|
.filter(download -> download.getStatus() == Download.DOWNLOADING);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Observable<Download> getStatusObservable() {
|
||||||
|
return statusSubject
|
||||||
|
.startWith(getActiveDownloads());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -9,8 +9,8 @@ public class Page implements NetworkHelper.ProgressListener {
|
|||||||
private String url;
|
private String url;
|
||||||
private String imageUrl;
|
private String imageUrl;
|
||||||
private String imagePath;
|
private String imagePath;
|
||||||
private transient int status;
|
private transient volatile int status;
|
||||||
private transient int progress;
|
private transient volatile int progress;
|
||||||
|
|
||||||
private transient BehaviorSubject<Integer> statusSubject;
|
private transient BehaviorSubject<Integer> statusSubject;
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ import eu.kanade.mangafeed.data.services.LibraryUpdateService;
|
|||||||
import eu.kanade.mangafeed.injection.module.AppModule;
|
import eu.kanade.mangafeed.injection.module.AppModule;
|
||||||
import eu.kanade.mangafeed.injection.module.DataModule;
|
import eu.kanade.mangafeed.injection.module.DataModule;
|
||||||
import eu.kanade.mangafeed.presenter.CataloguePresenter;
|
import eu.kanade.mangafeed.presenter.CataloguePresenter;
|
||||||
|
import eu.kanade.mangafeed.presenter.DownloadQueuePresenter;
|
||||||
import eu.kanade.mangafeed.presenter.LibraryPresenter;
|
import eu.kanade.mangafeed.presenter.LibraryPresenter;
|
||||||
import eu.kanade.mangafeed.presenter.MangaChaptersPresenter;
|
import eu.kanade.mangafeed.presenter.MangaChaptersPresenter;
|
||||||
import eu.kanade.mangafeed.presenter.MangaDetailPresenter;
|
import eu.kanade.mangafeed.presenter.MangaDetailPresenter;
|
||||||
@ -37,6 +38,7 @@ public interface AppComponent {
|
|||||||
void inject(MangaInfoPresenter mangaInfoPresenter);
|
void inject(MangaInfoPresenter mangaInfoPresenter);
|
||||||
void inject(MangaChaptersPresenter mangaChaptersPresenter);
|
void inject(MangaChaptersPresenter mangaChaptersPresenter);
|
||||||
void inject(ReaderPresenter readerPresenter);
|
void inject(ReaderPresenter readerPresenter);
|
||||||
|
void inject(DownloadQueuePresenter downloadQueuePresenter);
|
||||||
|
|
||||||
void inject(ReaderActivity readerActivity);
|
void inject(ReaderActivity readerActivity);
|
||||||
void inject(SettingsAccountsFragment settingsAccountsFragment);
|
void inject(SettingsAccountsFragment settingsAccountsFragment);
|
||||||
|
@ -0,0 +1,107 @@
|
|||||||
|
package eu.kanade.mangafeed.presenter;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import eu.kanade.mangafeed.data.helpers.DownloadManager;
|
||||||
|
import eu.kanade.mangafeed.data.models.Download;
|
||||||
|
import eu.kanade.mangafeed.data.models.DownloadQueue;
|
||||||
|
import eu.kanade.mangafeed.data.models.Page;
|
||||||
|
import eu.kanade.mangafeed.ui.fragment.DownloadQueueFragment;
|
||||||
|
import rx.Observable;
|
||||||
|
import rx.Subscription;
|
||||||
|
import rx.android.schedulers.AndroidSchedulers;
|
||||||
|
import rx.schedulers.Schedulers;
|
||||||
|
import timber.log.Timber;
|
||||||
|
|
||||||
|
public class DownloadQueuePresenter extends BasePresenter<DownloadQueueFragment> {
|
||||||
|
|
||||||
|
@Inject DownloadManager downloadManager;
|
||||||
|
|
||||||
|
private DownloadQueue downloadQueue;
|
||||||
|
private Subscription statusSubscription;
|
||||||
|
private HashMap<Download, Subscription> progressSubscriptions;
|
||||||
|
|
||||||
|
public final static int GET_DOWNLOAD_QUEUE = 1;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedState) {
|
||||||
|
super.onCreate(savedState);
|
||||||
|
|
||||||
|
downloadQueue = downloadManager.getQueue();
|
||||||
|
progressSubscriptions = new HashMap<>();
|
||||||
|
|
||||||
|
restartableLatestCache(GET_DOWNLOAD_QUEUE,
|
||||||
|
() -> Observable.just(downloadQueue.get()),
|
||||||
|
DownloadQueueFragment::onNextDownloads,
|
||||||
|
(view, error) -> Timber.e(error.getMessage()));
|
||||||
|
|
||||||
|
if (savedState == null)
|
||||||
|
start(GET_DOWNLOAD_QUEUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onTakeView(DownloadQueueFragment view) {
|
||||||
|
super.onTakeView(view);
|
||||||
|
|
||||||
|
statusSubscription = downloadQueue.getStatusObservable()
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(download -> {
|
||||||
|
processStatus(download, view);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDropView() {
|
||||||
|
destroySubscriptions();
|
||||||
|
super.onDropView();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processStatus(Download download, DownloadQueueFragment view) {
|
||||||
|
switch (download.getStatus()) {
|
||||||
|
case Download.DOWNLOADING:
|
||||||
|
observeProgress(download, view);
|
||||||
|
break;
|
||||||
|
case Download.DOWNLOADED:
|
||||||
|
unsubscribeProgress(download);
|
||||||
|
download.totalProgress = download.pages.size() * 100;
|
||||||
|
view.updateProgress(download);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void observeProgress(Download download, DownloadQueueFragment view) {
|
||||||
|
Subscription subscription = Observable.interval(50, TimeUnit.MILLISECONDS, Schedulers.newThread())
|
||||||
|
.flatMap(tick -> Observable.from(download.pages)
|
||||||
|
.map(Page::getProgress)
|
||||||
|
.reduce((x, y) -> x + y))
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(progress -> {
|
||||||
|
download.totalProgress = progress;
|
||||||
|
view.updateProgress(download);
|
||||||
|
});
|
||||||
|
|
||||||
|
progressSubscriptions.put(download, subscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unsubscribeProgress(Download download) {
|
||||||
|
Subscription subscription = progressSubscriptions.remove(download);
|
||||||
|
if (subscription != null)
|
||||||
|
subscription.unsubscribe();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void destroySubscriptions() {
|
||||||
|
for (Subscription subscription : progressSubscriptions.values()) {
|
||||||
|
subscription.unsubscribe();
|
||||||
|
}
|
||||||
|
progressSubscriptions.clear();
|
||||||
|
|
||||||
|
remove(statusSubscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -128,7 +128,7 @@ public class MangaChaptersPresenter extends BasePresenter<MangaChaptersFragment>
|
|||||||
.toList()
|
.toList()
|
||||||
.flatMap(db::insertChapters)
|
.flatMap(db::insertChapters)
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.doOnCompleted( () -> remove(markReadSubscription) )
|
.doOnCompleted(() -> remove(markReadSubscription))
|
||||||
.subscribe(result -> {
|
.subscribe(result -> {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@ -137,21 +137,10 @@ public class MangaChaptersPresenter extends BasePresenter<MangaChaptersFragment>
|
|||||||
add(downloadSubscription = selectedChapters
|
add(downloadSubscription = selectedChapters
|
||||||
.doOnCompleted(() -> remove(downloadSubscription))
|
.doOnCompleted(() -> remove(downloadSubscription))
|
||||||
.subscribe(chapter -> {
|
.subscribe(chapter -> {
|
||||||
EventBus.getDefault().post(
|
EventBus.getDefault().post(new DownloadChapterEvent(manga, chapter));
|
||||||
new DownloadChapterEvent(manga, chapter));
|
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkIsChapterDownloaded(Chapter chapter) {
|
|
||||||
File dir = downloadManager.getAbsoluteChapterDirectory(source, manga, chapter);
|
|
||||||
|
|
||||||
if (dir.exists() && dir.listFiles().length > 0) {
|
|
||||||
chapter.downloaded = Chapter.DOWNLOADED;
|
|
||||||
} else {
|
|
||||||
chapter.downloaded = Chapter.NOT_DOWNLOADED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deleteChapters(Observable<Chapter> selectedChapters) {
|
public void deleteChapters(Observable<Chapter> selectedChapters) {
|
||||||
deleteSubscription = selectedChapters
|
deleteSubscription = selectedChapters
|
||||||
.doOnCompleted( () -> remove(deleteSubscription) )
|
.doOnCompleted( () -> remove(deleteSubscription) )
|
||||||
@ -160,4 +149,16 @@ public class MangaChaptersPresenter extends BasePresenter<MangaChaptersFragment>
|
|||||||
chapter.downloaded = Chapter.NOT_DOWNLOADED;
|
chapter.downloaded = Chapter.NOT_DOWNLOADED;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void checkIsChapterDownloaded(Chapter chapter) {
|
||||||
|
File dir = downloadManager.getAbsoluteChapterDirectory(source, manga, chapter);
|
||||||
|
File pageList = new File(dir, DownloadManager.PAGE_LIST_FILE);
|
||||||
|
|
||||||
|
if (dir.exists() && dir.listFiles().length > 0 && pageList.exists()) {
|
||||||
|
chapter.downloaded = Chapter.DOWNLOADED;
|
||||||
|
} else {
|
||||||
|
chapter.downloaded = Chapter.NOT_DOWNLOADED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ import butterknife.Bind;
|
|||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.kanade.mangafeed.R;
|
import eu.kanade.mangafeed.R;
|
||||||
import eu.kanade.mangafeed.ui.activity.base.BaseActivity;
|
import eu.kanade.mangafeed.ui.activity.base.BaseActivity;
|
||||||
|
import eu.kanade.mangafeed.ui.fragment.DownloadQueueFragment;
|
||||||
import eu.kanade.mangafeed.ui.fragment.LibraryFragment;
|
import eu.kanade.mangafeed.ui.fragment.LibraryFragment;
|
||||||
import eu.kanade.mangafeed.ui.fragment.SourceFragment;
|
import eu.kanade.mangafeed.ui.fragment.SourceFragment;
|
||||||
|
|
||||||
@ -51,6 +52,9 @@ public class MainActivity extends BaseActivity {
|
|||||||
new PrimaryDrawerItem()
|
new PrimaryDrawerItem()
|
||||||
.withName(R.string.catalogues_title)
|
.withName(R.string.catalogues_title)
|
||||||
.withIdentifier(R.id.nav_drawer_catalogues),
|
.withIdentifier(R.id.nav_drawer_catalogues),
|
||||||
|
new PrimaryDrawerItem()
|
||||||
|
.withName(R.string.download_title)
|
||||||
|
.withIdentifier(R.id.nav_drawer_downloads),
|
||||||
new PrimaryDrawerItem()
|
new PrimaryDrawerItem()
|
||||||
.withName(R.string.settings_title)
|
.withName(R.string.settings_title)
|
||||||
.withIdentifier(R.id.nav_drawer_settings)
|
.withIdentifier(R.id.nav_drawer_settings)
|
||||||
@ -70,6 +74,9 @@ public class MainActivity extends BaseActivity {
|
|||||||
case R.id.nav_drawer_catalogues:
|
case R.id.nav_drawer_catalogues:
|
||||||
setFragment(SourceFragment.newInstance());
|
setFragment(SourceFragment.newInstance());
|
||||||
break;
|
break;
|
||||||
|
case R.id.nav_drawer_downloads:
|
||||||
|
setFragment(DownloadQueueFragment.newInstance());
|
||||||
|
break;
|
||||||
case R.id.nav_drawer_settings:
|
case R.id.nav_drawer_settings:
|
||||||
startActivity(new Intent(this, SettingsActivity.class));
|
startActivity(new Intent(this, SettingsActivity.class));
|
||||||
break;
|
break;
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
package eu.kanade.mangafeed.ui.fragment;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import butterknife.Bind;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import eu.kanade.mangafeed.R;
|
||||||
|
import eu.kanade.mangafeed.data.models.Download;
|
||||||
|
import eu.kanade.mangafeed.presenter.DownloadQueuePresenter;
|
||||||
|
import eu.kanade.mangafeed.ui.fragment.base.BaseRxFragment;
|
||||||
|
import eu.kanade.mangafeed.ui.holder.DownloadHolder;
|
||||||
|
import nucleus.factory.RequiresPresenter;
|
||||||
|
import uk.co.ribot.easyadapter.EasyRecyclerAdapter;
|
||||||
|
|
||||||
|
@RequiresPresenter(DownloadQueuePresenter.class)
|
||||||
|
public class DownloadQueueFragment extends BaseRxFragment<DownloadQueuePresenter> {
|
||||||
|
|
||||||
|
@Bind(R.id.download_list) RecyclerView downloadList;
|
||||||
|
private EasyRecyclerAdapter<Download> adapter;
|
||||||
|
|
||||||
|
public static DownloadQueueFragment newInstance() {
|
||||||
|
return new DownloadQueueFragment();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
// Inflate the layout for this fragment
|
||||||
|
View view = inflater.inflate(R.layout.fragment_download_queue, container, false);
|
||||||
|
ButterKnife.bind(this, view);
|
||||||
|
|
||||||
|
setToolbarTitle(R.string.download_title);
|
||||||
|
|
||||||
|
downloadList.setLayoutManager(new LinearLayoutManager(getActivity()));
|
||||||
|
createAdapter();
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createAdapter() {
|
||||||
|
adapter = new EasyRecyclerAdapter<>(getActivity(), DownloadHolder.class);
|
||||||
|
downloadList.setAdapter(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onNextDownloads(List<Download> downloads) {
|
||||||
|
adapter.setItems(downloads);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO use a better approach
|
||||||
|
public void updateProgress(Download download) {
|
||||||
|
for (int i = 0; i < adapter.getItems().size(); i++) {
|
||||||
|
if (adapter.getItem(i) == download) {
|
||||||
|
adapter.notifyItemChanged(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -2,7 +2,6 @@ package eu.kanade.mangafeed.ui.fragment;
|
|||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.support.v4.widget.SwipeRefreshLayout;
|
import android.support.v4.widget.SwipeRefreshLayout;
|
||||||
import android.support.v7.view.ActionMode;
|
import android.support.v7.view.ActionMode;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
@ -41,7 +40,7 @@ public class MangaChaptersFragment extends BaseRxFragment<MangaChaptersPresenter
|
|||||||
|
|
||||||
private ActionMode actionMode;
|
private ActionMode actionMode;
|
||||||
|
|
||||||
public static Fragment newInstance() {
|
public static MangaChaptersFragment newInstance() {
|
||||||
return new MangaChaptersFragment();
|
return new MangaChaptersFragment();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
package eu.kanade.mangafeed.ui.holder;
|
||||||
|
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import eu.kanade.mangafeed.R;
|
||||||
|
import eu.kanade.mangafeed.data.models.Download;
|
||||||
|
import uk.co.ribot.easyadapter.ItemViewHolder;
|
||||||
|
import uk.co.ribot.easyadapter.PositionInfo;
|
||||||
|
import uk.co.ribot.easyadapter.annotations.LayoutId;
|
||||||
|
import uk.co.ribot.easyadapter.annotations.ViewId;
|
||||||
|
|
||||||
|
@LayoutId(R.layout.item_download)
|
||||||
|
public class DownloadHolder extends ItemViewHolder<Download> {
|
||||||
|
|
||||||
|
@ViewId(R.id.download_title) TextView downloadTitle;
|
||||||
|
@ViewId(R.id.download_progress) ProgressBar downloadProgress;
|
||||||
|
|
||||||
|
public DownloadHolder(View view) {
|
||||||
|
super(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSetValues(Download download, PositionInfo positionInfo) {
|
||||||
|
downloadTitle.setText(download.chapter.name);
|
||||||
|
|
||||||
|
if (download.pages == null) {
|
||||||
|
downloadProgress.setProgress(0);
|
||||||
|
} else {
|
||||||
|
downloadProgress.setMax(download.pages.size() * 100);
|
||||||
|
downloadProgress.setProgress(download.totalProgress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
13
app/src/main/res/layout/fragment_download_queue.xml
Normal file
13
app/src/main/res/layout/fragment_download_queue.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical" android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<android.support.v7.widget.RecyclerView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/download_list">
|
||||||
|
|
||||||
|
</android.support.v7.widget.RecyclerView>
|
||||||
|
|
||||||
|
</LinearLayout>
|
32
app/src/main/res/layout/item_download.xml
Normal file
32
app/src/main/res/layout/item_download.xml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical" android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginLeft="15dp"
|
||||||
|
android:layout_marginRight="15dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:id="@+id/download_title"/>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
style="?android:attr/progressBarStyleHorizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/download_progress" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/download_progress_text"
|
||||||
|
android:layout_gravity="center_horizontal" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -4,4 +4,5 @@
|
|||||||
<item name="nav_drawer_recent_updates" type="id">nav_drawer_recent_updates</item>
|
<item name="nav_drawer_recent_updates" type="id">nav_drawer_recent_updates</item>
|
||||||
<item name="nav_drawer_catalogues" type="id">nav_drawer_catalogues</item>
|
<item name="nav_drawer_catalogues" type="id">nav_drawer_catalogues</item>
|
||||||
<item name="nav_drawer_settings" type="id">nav_drawer_settings</item>
|
<item name="nav_drawer_settings" type="id">nav_drawer_settings</item>
|
||||||
|
<item name="nav_drawer_downloads" type="id">nav_drawer_downloads</item>
|
||||||
</resources>
|
</resources>
|
@ -93,5 +93,6 @@
|
|||||||
<string name="notification_no_new_chapters">No new chapters found</string>
|
<string name="notification_no_new_chapters">No new chapters found</string>
|
||||||
<string name="notification_new_chapters">Found new chapters for:</string>
|
<string name="notification_new_chapters">Found new chapters for:</string>
|
||||||
<string name="pref_download_threads">Download threads</string>
|
<string name="pref_download_threads">Download threads</string>
|
||||||
|
<string name="download_title">Download queue</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user