Rename classes
This commit is contained in:
parent
fbf141aad8
commit
684c5e98d3
15 changed files with 287 additions and 287 deletions
|
@ -31,7 +31,7 @@
|
||||||
android:value="eu.kanade.mangafeed.ui.activity.MainActivity" />
|
android:value="eu.kanade.mangafeed.ui.activity.MainActivity" />
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.activity.CatalogueListActivity"
|
android:name=".ui.activity.CatalogueActivity"
|
||||||
android:label="@string/title_activity_catalogue_list"
|
android:label="@string/title_activity_catalogue_list"
|
||||||
android:parentActivityName=".ui.activity.MainActivity"
|
android:parentActivityName=".ui.activity.MainActivity"
|
||||||
android:theme="@style/AppTheme" >
|
android:theme="@style/AppTheme" >
|
||||||
|
|
|
@ -6,8 +6,8 @@ import javax.inject.Singleton;
|
||||||
|
|
||||||
import dagger.Component;
|
import dagger.Component;
|
||||||
import eu.kanade.mangafeed.data.DataModule;
|
import eu.kanade.mangafeed.data.DataModule;
|
||||||
import eu.kanade.mangafeed.presenter.CatalogueListPresenter;
|
|
||||||
import eu.kanade.mangafeed.presenter.CataloguePresenter;
|
import eu.kanade.mangafeed.presenter.CataloguePresenter;
|
||||||
|
import eu.kanade.mangafeed.presenter.SourcePresenter;
|
||||||
import eu.kanade.mangafeed.presenter.LibraryPresenter;
|
import eu.kanade.mangafeed.presenter.LibraryPresenter;
|
||||||
import eu.kanade.mangafeed.presenter.MangaDetailPresenter;
|
import eu.kanade.mangafeed.presenter.MangaDetailPresenter;
|
||||||
|
|
||||||
|
@ -22,8 +22,8 @@ public interface AppComponent {
|
||||||
|
|
||||||
void inject(LibraryPresenter libraryPresenter);
|
void inject(LibraryPresenter libraryPresenter);
|
||||||
void inject(MangaDetailPresenter mangaDetailPresenter);
|
void inject(MangaDetailPresenter mangaDetailPresenter);
|
||||||
|
void inject(SourcePresenter sourcePresenter);
|
||||||
void inject(CataloguePresenter cataloguePresenter);
|
void inject(CataloguePresenter cataloguePresenter);
|
||||||
void inject(CatalogueListPresenter catalogueListPresenter);
|
|
||||||
|
|
||||||
Application application();
|
Application application();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,227 +0,0 @@
|
||||||
package eu.kanade.mangafeed.presenter;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import com.bumptech.glide.Glide;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import eu.kanade.mangafeed.App;
|
|
||||||
import eu.kanade.mangafeed.data.helpers.DatabaseHelper;
|
|
||||||
import eu.kanade.mangafeed.data.helpers.SourceManager;
|
|
||||||
import eu.kanade.mangafeed.data.models.Manga;
|
|
||||||
import eu.kanade.mangafeed.sources.Source;
|
|
||||||
import eu.kanade.mangafeed.ui.adapter.CatalogueListHolder;
|
|
||||||
import eu.kanade.mangafeed.view.CatalogueListView;
|
|
||||||
import rx.Observable;
|
|
||||||
import rx.Subscription;
|
|
||||||
import rx.android.schedulers.AndroidSchedulers;
|
|
||||||
import rx.schedulers.Schedulers;
|
|
||||||
import rx.subjects.PublishSubject;
|
|
||||||
import timber.log.Timber;
|
|
||||||
import uk.co.ribot.easyadapter.EasyAdapter;
|
|
||||||
|
|
||||||
public class CatalogueListPresenter extends BasePresenter {
|
|
||||||
|
|
||||||
CatalogueListView view;
|
|
||||||
EasyAdapter<Manga> adapter;
|
|
||||||
Source selectedSource;
|
|
||||||
|
|
||||||
@Inject SourceManager sourceManager;
|
|
||||||
@Inject DatabaseHelper db;
|
|
||||||
|
|
||||||
private String mSearchName;
|
|
||||||
private boolean mSearchMode;
|
|
||||||
private final int SEARCH_TIMEOUT = 1000;
|
|
||||||
|
|
||||||
private Subscription mMangaFetchSubscription;
|
|
||||||
private Subscription mMangaSearchSubscription;
|
|
||||||
private Subscription mSearchViewSubscription;
|
|
||||||
private Subscription mMangaDetailFetchSubscription;
|
|
||||||
private PublishSubject<Observable<String>> mSearchViewPublishSubject;
|
|
||||||
private PublishSubject<Observable<List<Manga>>> mMangaDetailPublishSubject;
|
|
||||||
|
|
||||||
|
|
||||||
public CatalogueListPresenter(CatalogueListView view) {
|
|
||||||
this.view = view;
|
|
||||||
App.getComponent(view.getActivity()).inject(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initialize() {
|
|
||||||
initializeSource();
|
|
||||||
initializeAdapter();
|
|
||||||
initializeSearch();
|
|
||||||
initializeMangaDetailsLoader();
|
|
||||||
|
|
||||||
view.showProgressBar();
|
|
||||||
getMangasFromSource(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeSource() {
|
|
||||||
int sourceId = view.getIntent().getIntExtra(Intent.EXTRA_UID, -1);
|
|
||||||
selectedSource = sourceManager.get(sourceId);
|
|
||||||
view.setSourceTitle(selectedSource.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeAdapter() {
|
|
||||||
adapter = new EasyAdapter<>(view.getActivity(), CatalogueListHolder.class);
|
|
||||||
view.setAdapter(adapter);
|
|
||||||
view.setScrollListener();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeSearch() {
|
|
||||||
mSearchName = "";
|
|
||||||
mSearchMode = false;
|
|
||||||
mSearchViewPublishSubject = PublishSubject.create();
|
|
||||||
|
|
||||||
mSearchViewSubscription = Observable.switchOnNext(mSearchViewPublishSubject)
|
|
||||||
.debounce(SEARCH_TIMEOUT, TimeUnit.MILLISECONDS)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe(
|
|
||||||
this::queryFromSearch,
|
|
||||||
error -> Timber.e(error.getCause(), error.getMessage()));
|
|
||||||
|
|
||||||
subscriptions.add(mSearchViewSubscription);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeMangaDetailsLoader() {
|
|
||||||
mMangaDetailPublishSubject = PublishSubject.create();
|
|
||||||
|
|
||||||
mMangaDetailFetchSubscription = Observable.switchOnNext(mMangaDetailPublishSubject)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.flatMap(Observable::from)
|
|
||||||
.filter(manga -> !manga.initialized)
|
|
||||||
.buffer(3)
|
|
||||||
.concatMap(localMangas -> {
|
|
||||||
List<Observable<Manga>> mangaObservables = new ArrayList<>();
|
|
||||||
for (Manga manga : localMangas) {
|
|
||||||
Observable<Manga> tempObs = selectedSource.pullMangaFromNetwork(manga.url)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.flatMap(networkManga -> {
|
|
||||||
Manga.copyFromNetwork(manga, networkManga);
|
|
||||||
db.insertMangaBlock(manga);
|
|
||||||
return Observable.just(manga);
|
|
||||||
});
|
|
||||||
mangaObservables.add(tempObs);
|
|
||||||
}
|
|
||||||
return Observable.merge(mangaObservables);
|
|
||||||
})
|
|
||||||
.filter(manga -> manga.initialized)
|
|
||||||
.onBackpressureBuffer()
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe(manga -> {
|
|
||||||
// Get manga index in the adapter
|
|
||||||
int index = getMangaIndex(manga);
|
|
||||||
// Get the image view associated with the manga.
|
|
||||||
// If it's null (not visible in the screen) there's no need to update the image.
|
|
||||||
ImageView imageView = view.getImageView(index);
|
|
||||||
if (imageView != null) {
|
|
||||||
updateImage(imageView, manga.thumbnail_url);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
subscriptions.add(mMangaDetailFetchSubscription);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getMangasFromSource(int page) {
|
|
||||||
subscriptions.remove(mMangaFetchSubscription);
|
|
||||||
|
|
||||||
mMangaFetchSubscription = getMangasSubscriber(
|
|
||||||
selectedSource.pullPopularMangasFromNetwork(page));
|
|
||||||
|
|
||||||
subscriptions.add(mMangaFetchSubscription);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getMangasFromSearch(int page) {
|
|
||||||
subscriptions.remove(mMangaSearchSubscription);
|
|
||||||
|
|
||||||
mMangaSearchSubscription = getMangasSubscriber(
|
|
||||||
selectedSource.searchMangasFromNetwork(mSearchName, page));
|
|
||||||
|
|
||||||
subscriptions.add(mMangaSearchSubscription);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Subscription getMangasSubscriber(Observable<List<Manga>> mangas) {
|
|
||||||
return mangas
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.flatMap(Observable::from)
|
|
||||||
.map(this::networkToLocalManga)
|
|
||||||
.toList()
|
|
||||||
.subscribe(newMangas -> {
|
|
||||||
view.hideProgressBar();
|
|
||||||
adapter.addItems(newMangas);
|
|
||||||
if (mMangaDetailPublishSubject != null)
|
|
||||||
mMangaDetailPublishSubject.onNext(Observable.just(newMangas));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private Manga networkToLocalManga(Manga networkManga) {
|
|
||||||
Manga localManga = db.getMangaBlock(networkManga.url);
|
|
||||||
if (localManga == null) {
|
|
||||||
db.insertMangaBlock(networkManga);
|
|
||||||
localManga = db.getMangaBlock(networkManga.url);
|
|
||||||
}
|
|
||||||
return localManga;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onQueryTextChange(String query) {
|
|
||||||
if (mSearchViewPublishSubject != null)
|
|
||||||
mSearchViewPublishSubject.onNext(Observable.just(query));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void queryFromSearch(String query) {
|
|
||||||
// If search button clicked
|
|
||||||
if (mSearchName.equals("") && query.equals("")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// If going to search mode
|
|
||||||
else if (mSearchName.equals("") && !query.equals("")) {
|
|
||||||
mSearchMode = true;
|
|
||||||
}
|
|
||||||
// If going to normal mode
|
|
||||||
else if (!mSearchName.equals("") && query.equals("")) {
|
|
||||||
mSearchMode = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
mSearchName = query;
|
|
||||||
adapter.getItems().clear();
|
|
||||||
view.showProgressBar();
|
|
||||||
view.resetScrollListener();
|
|
||||||
loadMoreMangas(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void loadMoreMangas(int page) {
|
|
||||||
if (page > 1) {
|
|
||||||
view.showGridProgressBar();
|
|
||||||
}
|
|
||||||
if (mSearchMode) {
|
|
||||||
getMangasFromSearch(page);
|
|
||||||
} else {
|
|
||||||
getMangasFromSource(page);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getMangaIndex(Manga manga) {
|
|
||||||
for (int i = 0; i < adapter.getCount(); i++) {
|
|
||||||
if (manga.id == adapter.getItem(i).id) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateImage(ImageView imageView, String thumbnail) {
|
|
||||||
Glide.with(view.getActivity())
|
|
||||||
.load(thumbnail)
|
|
||||||
.centerCrop()
|
|
||||||
.into(imageView);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,44 +1,227 @@
|
||||||
package eu.kanade.mangafeed.presenter;
|
package eu.kanade.mangafeed.presenter;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import eu.kanade.mangafeed.App;
|
import eu.kanade.mangafeed.App;
|
||||||
|
import eu.kanade.mangafeed.data.helpers.DatabaseHelper;
|
||||||
import eu.kanade.mangafeed.data.helpers.SourceManager;
|
import eu.kanade.mangafeed.data.helpers.SourceManager;
|
||||||
|
import eu.kanade.mangafeed.data.models.Manga;
|
||||||
import eu.kanade.mangafeed.sources.Source;
|
import eu.kanade.mangafeed.sources.Source;
|
||||||
import eu.kanade.mangafeed.ui.activity.CatalogueListActivity;
|
import eu.kanade.mangafeed.ui.adapter.CatalogueHolder;
|
||||||
import eu.kanade.mangafeed.ui.adapter.SourceHolder;
|
|
||||||
import eu.kanade.mangafeed.view.CatalogueView;
|
import eu.kanade.mangafeed.view.CatalogueView;
|
||||||
|
import rx.Observable;
|
||||||
|
import rx.Subscription;
|
||||||
|
import rx.android.schedulers.AndroidSchedulers;
|
||||||
|
import rx.schedulers.Schedulers;
|
||||||
|
import rx.subjects.PublishSubject;
|
||||||
|
import timber.log.Timber;
|
||||||
import uk.co.ribot.easyadapter.EasyAdapter;
|
import uk.co.ribot.easyadapter.EasyAdapter;
|
||||||
|
|
||||||
|
public class CataloguePresenter extends BasePresenter {
|
||||||
|
|
||||||
public class CataloguePresenter {
|
CatalogueView view;
|
||||||
|
EasyAdapter<Manga> adapter;
|
||||||
private CatalogueView view;
|
Source selectedSource;
|
||||||
|
|
||||||
@Inject SourceManager sourceManager;
|
@Inject SourceManager sourceManager;
|
||||||
|
@Inject DatabaseHelper db;
|
||||||
|
|
||||||
|
private String mSearchName;
|
||||||
|
private boolean mSearchMode;
|
||||||
|
private final int SEARCH_TIMEOUT = 1000;
|
||||||
|
|
||||||
|
private Subscription mMangaFetchSubscription;
|
||||||
|
private Subscription mMangaSearchSubscription;
|
||||||
|
private Subscription mSearchViewSubscription;
|
||||||
|
private Subscription mMangaDetailFetchSubscription;
|
||||||
|
private PublishSubject<Observable<String>> mSearchViewPublishSubject;
|
||||||
|
private PublishSubject<Observable<List<Manga>>> mMangaDetailPublishSubject;
|
||||||
|
|
||||||
EasyAdapter<Source> adapter;
|
|
||||||
|
|
||||||
public CataloguePresenter(CatalogueView view) {
|
public CataloguePresenter(CatalogueView view) {
|
||||||
this.view = view;
|
this.view = view;
|
||||||
App.getComponent(view.getActivity()).inject(this);
|
App.getComponent(view.getActivity()).inject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initializeSources() {
|
public void initialize() {
|
||||||
adapter = new EasyAdapter<>(
|
initializeSource();
|
||||||
view.getActivity(),
|
initializeAdapter();
|
||||||
SourceHolder.class,
|
initializeSearch();
|
||||||
sourceManager.getSources());
|
initializeMangaDetailsLoader();
|
||||||
|
|
||||||
|
view.showProgressBar();
|
||||||
|
getMangasFromSource(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializeSource() {
|
||||||
|
int sourceId = view.getIntent().getIntExtra(Intent.EXTRA_UID, -1);
|
||||||
|
selectedSource = sourceManager.get(sourceId);
|
||||||
|
view.setSourceTitle(selectedSource.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializeAdapter() {
|
||||||
|
adapter = new EasyAdapter<>(view.getActivity(), CatalogueHolder.class);
|
||||||
view.setAdapter(adapter);
|
view.setAdapter(adapter);
|
||||||
view.setSourceClickListener();
|
view.setScrollListener();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSourceClick(int position) {
|
private void initializeSearch() {
|
||||||
Intent intent = new Intent(view.getActivity(), CatalogueListActivity.class);
|
mSearchName = "";
|
||||||
intent.putExtra(Intent.EXTRA_UID, adapter.getItem(position).getSource());
|
mSearchMode = false;
|
||||||
view.getActivity().startActivity(intent);
|
mSearchViewPublishSubject = PublishSubject.create();
|
||||||
|
|
||||||
|
mSearchViewSubscription = Observable.switchOnNext(mSearchViewPublishSubject)
|
||||||
|
.debounce(SEARCH_TIMEOUT, TimeUnit.MILLISECONDS)
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(
|
||||||
|
this::queryFromSearch,
|
||||||
|
error -> Timber.e(error.getCause(), error.getMessage()));
|
||||||
|
|
||||||
|
subscriptions.add(mSearchViewSubscription);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initializeMangaDetailsLoader() {
|
||||||
|
mMangaDetailPublishSubject = PublishSubject.create();
|
||||||
|
|
||||||
|
mMangaDetailFetchSubscription = Observable.switchOnNext(mMangaDetailPublishSubject)
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.flatMap(Observable::from)
|
||||||
|
.filter(manga -> !manga.initialized)
|
||||||
|
.buffer(3)
|
||||||
|
.concatMap(localMangas -> {
|
||||||
|
List<Observable<Manga>> mangaObservables = new ArrayList<>();
|
||||||
|
for (Manga manga : localMangas) {
|
||||||
|
Observable<Manga> tempObs = selectedSource.pullMangaFromNetwork(manga.url)
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.flatMap(networkManga -> {
|
||||||
|
Manga.copyFromNetwork(manga, networkManga);
|
||||||
|
db.insertMangaBlock(manga);
|
||||||
|
return Observable.just(manga);
|
||||||
|
});
|
||||||
|
mangaObservables.add(tempObs);
|
||||||
|
}
|
||||||
|
return Observable.merge(mangaObservables);
|
||||||
|
})
|
||||||
|
.filter(manga -> manga.initialized)
|
||||||
|
.onBackpressureBuffer()
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(manga -> {
|
||||||
|
// Get manga index in the adapter
|
||||||
|
int index = getMangaIndex(manga);
|
||||||
|
// Get the image view associated with the manga.
|
||||||
|
// If it's null (not visible in the screen) there's no need to update the image.
|
||||||
|
ImageView imageView = view.getImageView(index);
|
||||||
|
if (imageView != null) {
|
||||||
|
updateImage(imageView, manga.thumbnail_url);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
subscriptions.add(mMangaDetailFetchSubscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getMangasFromSource(int page) {
|
||||||
|
subscriptions.remove(mMangaFetchSubscription);
|
||||||
|
|
||||||
|
mMangaFetchSubscription = getMangasSubscriber(
|
||||||
|
selectedSource.pullPopularMangasFromNetwork(page));
|
||||||
|
|
||||||
|
subscriptions.add(mMangaFetchSubscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getMangasFromSearch(int page) {
|
||||||
|
subscriptions.remove(mMangaSearchSubscription);
|
||||||
|
|
||||||
|
mMangaSearchSubscription = getMangasSubscriber(
|
||||||
|
selectedSource.searchMangasFromNetwork(mSearchName, page));
|
||||||
|
|
||||||
|
subscriptions.add(mMangaSearchSubscription);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Subscription getMangasSubscriber(Observable<List<Manga>> mangas) {
|
||||||
|
return mangas
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.flatMap(Observable::from)
|
||||||
|
.map(this::networkToLocalManga)
|
||||||
|
.toList()
|
||||||
|
.subscribe(newMangas -> {
|
||||||
|
view.hideProgressBar();
|
||||||
|
adapter.addItems(newMangas);
|
||||||
|
if (mMangaDetailPublishSubject != null)
|
||||||
|
mMangaDetailPublishSubject.onNext(Observable.just(newMangas));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private Manga networkToLocalManga(Manga networkManga) {
|
||||||
|
Manga localManga = db.getMangaBlock(networkManga.url);
|
||||||
|
if (localManga == null) {
|
||||||
|
db.insertMangaBlock(networkManga);
|
||||||
|
localManga = db.getMangaBlock(networkManga.url);
|
||||||
|
}
|
||||||
|
return localManga;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onQueryTextChange(String query) {
|
||||||
|
if (mSearchViewPublishSubject != null)
|
||||||
|
mSearchViewPublishSubject.onNext(Observable.just(query));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void queryFromSearch(String query) {
|
||||||
|
// If search button clicked
|
||||||
|
if (mSearchName.equals("") && query.equals("")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// If going to search mode
|
||||||
|
else if (mSearchName.equals("") && !query.equals("")) {
|
||||||
|
mSearchMode = true;
|
||||||
|
}
|
||||||
|
// If going to normal mode
|
||||||
|
else if (!mSearchName.equals("") && query.equals("")) {
|
||||||
|
mSearchMode = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
mSearchName = query;
|
||||||
|
adapter.getItems().clear();
|
||||||
|
view.showProgressBar();
|
||||||
|
view.resetScrollListener();
|
||||||
|
loadMoreMangas(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadMoreMangas(int page) {
|
||||||
|
if (page > 1) {
|
||||||
|
view.showGridProgressBar();
|
||||||
|
}
|
||||||
|
if (mSearchMode) {
|
||||||
|
getMangasFromSearch(page);
|
||||||
|
} else {
|
||||||
|
getMangasFromSource(page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getMangaIndex(Manga manga) {
|
||||||
|
for (int i = 0; i < adapter.getCount(); i++) {
|
||||||
|
if (manga.id == adapter.getItem(i).id) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateImage(ImageView imageView, String thumbnail) {
|
||||||
|
Glide.with(view.getActivity())
|
||||||
|
.load(thumbnail)
|
||||||
|
.centerCrop()
|
||||||
|
.into(imageView);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
package eu.kanade.mangafeed.presenter;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import eu.kanade.mangafeed.App;
|
||||||
|
import eu.kanade.mangafeed.data.helpers.SourceManager;
|
||||||
|
import eu.kanade.mangafeed.sources.Source;
|
||||||
|
import eu.kanade.mangafeed.ui.activity.CatalogueActivity;
|
||||||
|
import eu.kanade.mangafeed.ui.adapter.SourceHolder;
|
||||||
|
import eu.kanade.mangafeed.view.SourceView;
|
||||||
|
import uk.co.ribot.easyadapter.EasyAdapter;
|
||||||
|
|
||||||
|
|
||||||
|
public class SourcePresenter {
|
||||||
|
|
||||||
|
private SourceView view;
|
||||||
|
|
||||||
|
@Inject SourceManager sourceManager;
|
||||||
|
|
||||||
|
EasyAdapter<Source> adapter;
|
||||||
|
|
||||||
|
public SourcePresenter(SourceView view) {
|
||||||
|
this.view = view;
|
||||||
|
App.getComponent(view.getActivity()).inject(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeSources() {
|
||||||
|
adapter = new EasyAdapter<>(
|
||||||
|
view.getActivity(),
|
||||||
|
SourceHolder.class,
|
||||||
|
sourceManager.getSources());
|
||||||
|
|
||||||
|
view.setAdapter(adapter);
|
||||||
|
view.setSourceClickListener();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSourceClick(int position) {
|
||||||
|
Intent intent = new Intent(view.getActivity(), CatalogueActivity.class);
|
||||||
|
intent.putExtra(Intent.EXTRA_UID, adapter.getItem(position).getSource());
|
||||||
|
view.getActivity().startActivity(intent);
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,12 +12,12 @@ import android.widget.ProgressBar;
|
||||||
import butterknife.Bind;
|
import butterknife.Bind;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.kanade.mangafeed.R;
|
import eu.kanade.mangafeed.R;
|
||||||
import eu.kanade.mangafeed.presenter.CatalogueListPresenter;
|
import eu.kanade.mangafeed.presenter.CataloguePresenter;
|
||||||
import eu.kanade.mangafeed.view.CatalogueListView;
|
import eu.kanade.mangafeed.view.CatalogueView;
|
||||||
import eu.kanade.mangafeed.widget.EndlessScrollListener;
|
import eu.kanade.mangafeed.widget.EndlessScrollListener;
|
||||||
import uk.co.ribot.easyadapter.EasyAdapter;
|
import uk.co.ribot.easyadapter.EasyAdapter;
|
||||||
|
|
||||||
public class CatalogueListActivity extends BaseActivity implements CatalogueListView {
|
public class CatalogueActivity extends BaseActivity implements CatalogueView {
|
||||||
|
|
||||||
@Bind(R.id.toolbar)
|
@Bind(R.id.toolbar)
|
||||||
Toolbar toolbar;
|
Toolbar toolbar;
|
||||||
|
@ -31,7 +31,7 @@ public class CatalogueListActivity extends BaseActivity implements CatalogueList
|
||||||
@Bind(R.id.progress_grid)
|
@Bind(R.id.progress_grid)
|
||||||
ProgressBar progress_grid;
|
ProgressBar progress_grid;
|
||||||
|
|
||||||
private CatalogueListPresenter presenter;
|
private CataloguePresenter presenter;
|
||||||
|
|
||||||
private EndlessScrollListener scrollListener;
|
private EndlessScrollListener scrollListener;
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ public class CatalogueListActivity extends BaseActivity implements CatalogueList
|
||||||
|
|
||||||
setupToolbar(toolbar);
|
setupToolbar(toolbar);
|
||||||
|
|
||||||
presenter = new CatalogueListPresenter(this);
|
presenter = new CataloguePresenter(this);
|
||||||
presenter.initialize();
|
presenter.initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ public class CatalogueListActivity extends BaseActivity implements CatalogueList
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// CatalogueListView
|
// CatalogueView
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSourceTitle(String title) {
|
public void setSourceTitle(String title) {
|
|
@ -13,7 +13,7 @@ import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
|
||||||
import butterknife.Bind;
|
import butterknife.Bind;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.kanade.mangafeed.R;
|
import eu.kanade.mangafeed.R;
|
||||||
import eu.kanade.mangafeed.ui.fragment.CatalogueFragment;
|
import eu.kanade.mangafeed.ui.fragment.SourceFragment;
|
||||||
import eu.kanade.mangafeed.ui.fragment.LibraryFragment;
|
import eu.kanade.mangafeed.ui.fragment.LibraryFragment;
|
||||||
|
|
||||||
public class MainActivity extends BaseActivity {
|
public class MainActivity extends BaseActivity {
|
||||||
|
@ -65,7 +65,7 @@ public class MainActivity extends BaseActivity {
|
||||||
case R.id.nav_drawer_recent_updates:
|
case R.id.nav_drawer_recent_updates:
|
||||||
break;
|
break;
|
||||||
case R.id.nav_drawer_catalogues:
|
case R.id.nav_drawer_catalogues:
|
||||||
setFragment(CatalogueFragment.newInstance());
|
setFragment(SourceFragment.newInstance());
|
||||||
break;
|
break;
|
||||||
case R.id.nav_drawer_settings:
|
case R.id.nav_drawer_settings:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -15,7 +15,7 @@ import uk.co.ribot.easyadapter.annotations.LayoutId;
|
||||||
import uk.co.ribot.easyadapter.annotations.ViewId;
|
import uk.co.ribot.easyadapter.annotations.ViewId;
|
||||||
|
|
||||||
@LayoutId(R.layout.item_catalogue)
|
@LayoutId(R.layout.item_catalogue)
|
||||||
public class CatalogueListHolder extends ItemViewHolder<Manga> {
|
public class CatalogueHolder extends ItemViewHolder<Manga> {
|
||||||
|
|
||||||
@ViewId(R.id.catalogue_title)
|
@ViewId(R.id.catalogue_title)
|
||||||
TextView title;
|
TextView title;
|
||||||
|
@ -23,7 +23,7 @@ public class CatalogueListHolder extends ItemViewHolder<Manga> {
|
||||||
@ViewId(R.id.catalogue_thumbnail)
|
@ViewId(R.id.catalogue_thumbnail)
|
||||||
ImageView image;
|
ImageView image;
|
||||||
|
|
||||||
public CatalogueListHolder(View view) {
|
public CatalogueHolder(View view) {
|
||||||
super(view);
|
super(view);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ public class LibraryAdapter<T> extends EasyAdapter<T> implements Filterable {
|
||||||
|
|
||||||
public LibraryAdapter(Context context) {
|
public LibraryAdapter(Context context) {
|
||||||
super(context, LibraryHolder.class);
|
super(context, LibraryHolder.class);
|
||||||
filter = new CatalogueFilter();
|
filter = new LibraryFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNewItems(List<T> list) {
|
public void setNewItems(List<T> list) {
|
||||||
|
@ -30,7 +30,7 @@ public class LibraryAdapter<T> extends EasyAdapter<T> implements Filterable {
|
||||||
return filter;
|
return filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class CatalogueFilter extends Filter {
|
private class LibraryFilter extends Filter {
|
||||||
@Override
|
@Override
|
||||||
protected FilterResults performFiltering(CharSequence charSequence) {
|
protected FilterResults performFiltering(CharSequence charSequence) {
|
||||||
FilterResults results = new FilterResults();
|
FilterResults results = new FilterResults();
|
||||||
|
|
|
@ -9,22 +9,22 @@ import android.widget.ListView;
|
||||||
import butterknife.Bind;
|
import butterknife.Bind;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.kanade.mangafeed.R;
|
import eu.kanade.mangafeed.R;
|
||||||
import eu.kanade.mangafeed.presenter.CataloguePresenter;
|
import eu.kanade.mangafeed.presenter.SourcePresenter;
|
||||||
import eu.kanade.mangafeed.ui.activity.MainActivity;
|
import eu.kanade.mangafeed.ui.activity.MainActivity;
|
||||||
import eu.kanade.mangafeed.view.CatalogueView;
|
import eu.kanade.mangafeed.view.SourceView;
|
||||||
import uk.co.ribot.easyadapter.EasyAdapter;
|
import uk.co.ribot.easyadapter.EasyAdapter;
|
||||||
|
|
||||||
|
|
||||||
public class CatalogueFragment extends BaseFragment implements CatalogueView {
|
public class SourceFragment extends BaseFragment implements SourceView {
|
||||||
|
|
||||||
private CataloguePresenter presenter;
|
private SourcePresenter presenter;
|
||||||
private MainActivity activity;
|
private MainActivity activity;
|
||||||
|
|
||||||
@Bind(R.id.catalogue_list)
|
@Bind(R.id.catalogue_list)
|
||||||
ListView source_list;
|
ListView source_list;
|
||||||
|
|
||||||
public static CatalogueFragment newInstance() {
|
public static SourceFragment newInstance() {
|
||||||
CatalogueFragment fragment = new CatalogueFragment();
|
SourceFragment fragment = new SourceFragment();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
fragment.setArguments(args);
|
fragment.setArguments(args);
|
||||||
return fragment;
|
return fragment;
|
||||||
|
@ -34,7 +34,7 @@ public class CatalogueFragment extends BaseFragment implements CatalogueView {
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
presenter = new CataloguePresenter(this);
|
presenter = new SourcePresenter(this);
|
||||||
activity = (MainActivity)getActivity();
|
activity = (MainActivity)getActivity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ public class CatalogueFragment extends BaseFragment implements CatalogueView {
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CatalogueView
|
// SourceView
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAdapter(EasyAdapter adapter) {
|
public void setAdapter(EasyAdapter adapter) {
|
|
@ -1,18 +0,0 @@
|
||||||
package eu.kanade.mangafeed.view;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import uk.co.ribot.easyadapter.EasyAdapter;
|
|
||||||
|
|
||||||
public interface CatalogueListView extends BaseView {
|
|
||||||
Intent getIntent();
|
|
||||||
void setSourceTitle(String title);
|
|
||||||
void setAdapter(EasyAdapter adapter);
|
|
||||||
void setScrollListener();
|
|
||||||
void resetScrollListener();
|
|
||||||
void showProgressBar();
|
|
||||||
void showGridProgressBar();
|
|
||||||
void hideProgressBar();
|
|
||||||
ImageView getImageView(int position);
|
|
||||||
}
|
|
|
@ -1,8 +1,18 @@
|
||||||
package eu.kanade.mangafeed.view;
|
package eu.kanade.mangafeed.view;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
import uk.co.ribot.easyadapter.EasyAdapter;
|
import uk.co.ribot.easyadapter.EasyAdapter;
|
||||||
|
|
||||||
public interface CatalogueView extends BaseView {
|
public interface CatalogueView extends BaseView {
|
||||||
|
Intent getIntent();
|
||||||
|
void setSourceTitle(String title);
|
||||||
void setAdapter(EasyAdapter adapter);
|
void setAdapter(EasyAdapter adapter);
|
||||||
void setSourceClickListener();
|
void setScrollListener();
|
||||||
|
void resetScrollListener();
|
||||||
|
void showProgressBar();
|
||||||
|
void showGridProgressBar();
|
||||||
|
void hideProgressBar();
|
||||||
|
ImageView getImageView(int position);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
package eu.kanade.mangafeed.view;
|
||||||
|
|
||||||
|
import uk.co.ribot.easyadapter.EasyAdapter;
|
||||||
|
|
||||||
|
public interface SourceView extends BaseView {
|
||||||
|
void setAdapter(EasyAdapter adapter);
|
||||||
|
void setSourceClickListener();
|
||||||
|
}
|
|
@ -5,7 +5,7 @@
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent" android:fitsSystemWindows="true"
|
android:layout_height="match_parent" android:fitsSystemWindows="true"
|
||||||
tools:context="eu.kanade.mangafeed.ui.activity.CatalogueListActivity">
|
tools:context="eu.kanade.mangafeed.ui.activity.CatalogueActivity">
|
||||||
|
|
||||||
<include
|
<include
|
||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context="eu.kanade.mangafeed.ui.fragment.CatalogueFragment">
|
tools:context="eu.kanade.mangafeed.ui.fragment.SourceFragment">
|
||||||
|
|
||||||
|
|
||||||
<ListView
|
<ListView
|
||||||
|
|
Reference in a new issue