Improve the use and caching of the covers' cache. Use restartables in LibraryPresenter
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package eu.kanade.mangafeed.ui.library;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Filter;
|
||||
import android.widget.Filterable;
|
||||
|
||||
@@ -14,10 +15,12 @@ public class LibraryAdapter extends EasyAdapter<Manga> implements Filterable {
|
||||
|
||||
List<Manga> mangas;
|
||||
Filter filter;
|
||||
private LibraryPresenter presenter;
|
||||
|
||||
public LibraryAdapter(Context context) {
|
||||
super(context, LibraryHolder.class);
|
||||
public LibraryAdapter(LibraryFragment fragment) {
|
||||
super(fragment.getActivity(), LibraryHolder.class);
|
||||
filter = new LibraryFilter();
|
||||
presenter = fragment.getPresenter();
|
||||
}
|
||||
|
||||
public void setNewItems(List<Manga> list) {
|
||||
@@ -57,9 +60,16 @@ public class LibraryAdapter extends EasyAdapter<Manga> implements Filterable {
|
||||
|
||||
@Override
|
||||
public void publishResults(CharSequence constraint, FilterResults results) {
|
||||
setItems((List<Manga >) results.values);
|
||||
setItems((List<Manga>) results.values);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
View view = super.getView(position, convertView, parent);
|
||||
LibraryHolder holder = (LibraryHolder) view.getTag();
|
||||
Manga manga = getItem(position);
|
||||
holder.loadCover(manga, presenter.sourceManager.get(manga.source), presenter.coverCache);
|
||||
return view;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package eu.kanade.mangafeed.ui.library;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.SearchView;
|
||||
import android.util.SparseBooleanArray;
|
||||
import android.view.ActionMode;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
@@ -20,9 +21,10 @@ import butterknife.OnItemClick;
|
||||
import eu.kanade.mangafeed.R;
|
||||
import eu.kanade.mangafeed.data.database.models.Manga;
|
||||
import eu.kanade.mangafeed.data.sync.LibraryUpdateService;
|
||||
import eu.kanade.mangafeed.ui.manga.MangaActivity;
|
||||
import eu.kanade.mangafeed.ui.base.fragment.BaseRxFragment;
|
||||
import eu.kanade.mangafeed.ui.manga.MangaActivity;
|
||||
import nucleus.factory.RequiresPresenter;
|
||||
import rx.Observable;
|
||||
|
||||
@RequiresPresenter(LibraryPresenter.class)
|
||||
public class LibraryFragment extends BaseRxFragment<LibraryPresenter> {
|
||||
@@ -31,10 +33,7 @@ public class LibraryFragment extends BaseRxFragment<LibraryPresenter> {
|
||||
private LibraryAdapter adapter;
|
||||
|
||||
public static LibraryFragment newInstance() {
|
||||
LibraryFragment fragment = new LibraryFragment();
|
||||
Bundle args = new Bundle();
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
return new LibraryFragment();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -95,7 +94,7 @@ public class LibraryFragment extends BaseRxFragment<LibraryPresenter> {
|
||||
}
|
||||
|
||||
private void createAdapter() {
|
||||
adapter = new LibraryAdapter(getActivity());
|
||||
adapter = new LibraryAdapter(this);
|
||||
grid.setAdapter(adapter);
|
||||
}
|
||||
|
||||
@@ -136,7 +135,7 @@ public class LibraryFragment extends BaseRxFragment<LibraryPresenter> {
|
||||
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.action_delete:
|
||||
getPresenter().onDelete(grid.getCheckedItemPositions(), adapter);
|
||||
getPresenter().deleteMangas(getSelectedMangas());
|
||||
mode.finish();
|
||||
return true;
|
||||
}
|
||||
@@ -150,4 +149,11 @@ public class LibraryFragment extends BaseRxFragment<LibraryPresenter> {
|
||||
});
|
||||
}
|
||||
|
||||
private Observable<Manga> getSelectedMangas() {
|
||||
SparseBooleanArray checkedItems = grid.getCheckedItemPositions();
|
||||
return Observable.range(0, checkedItems.size())
|
||||
.map(checkedItems::keyAt)
|
||||
.map(adapter::getItem);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import android.widget.TextView;
|
||||
import eu.kanade.mangafeed.R;
|
||||
import eu.kanade.mangafeed.data.cache.CoverCache;
|
||||
import eu.kanade.mangafeed.data.database.models.Manga;
|
||||
import eu.kanade.mangafeed.data.source.base.Source;
|
||||
import uk.co.ribot.easyadapter.ItemViewHolder;
|
||||
import uk.co.ribot.easyadapter.PositionInfo;
|
||||
import uk.co.ribot.easyadapter.annotations.LayoutId;
|
||||
@@ -17,11 +18,8 @@ import uk.co.ribot.easyadapter.annotations.ViewId;
|
||||
public class LibraryHolder extends ItemViewHolder<Manga> {
|
||||
|
||||
@ViewId(R.id.thumbnail) ImageView thumbnail;
|
||||
|
||||
@ViewId(R.id.title) TextView title;
|
||||
|
||||
@ViewId(R.id.author) TextView author;
|
||||
|
||||
@ViewId(R.id.unreadText) TextView unreadText;
|
||||
|
||||
public LibraryHolder(View view) {
|
||||
@@ -38,12 +36,11 @@ public class LibraryHolder extends ItemViewHolder<Manga> {
|
||||
} else {
|
||||
unreadText.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
if (manga.thumbnail_url != null) {
|
||||
CoverCache.loadLocalInto(getContext(), thumbnail, manga.thumbnail_url);
|
||||
} else {
|
||||
thumbnail.setImageResource(android.R.color.transparent);
|
||||
}
|
||||
public void loadCover(Manga manga, Source source, CoverCache coverCache) {
|
||||
if (manga.thumbnail_url != null)
|
||||
coverCache.saveAndLoadFromCache(thumbnail, manga.thumbnail_url, source.getGlideHeaders());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
package eu.kanade.mangafeed.ui.library;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.util.SparseBooleanArray;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import eu.kanade.mangafeed.data.cache.CoverCache;
|
||||
import eu.kanade.mangafeed.data.database.DatabaseHelper;
|
||||
import eu.kanade.mangafeed.data.database.models.Manga;
|
||||
import eu.kanade.mangafeed.data.preference.PreferencesHelper;
|
||||
import eu.kanade.mangafeed.data.source.SourceManager;
|
||||
import eu.kanade.mangafeed.ui.base.presenter.BasePresenter;
|
||||
import rx.Observable;
|
||||
import rx.Subscription;
|
||||
import rx.android.schedulers.AndroidSchedulers;
|
||||
import rx.schedulers.Schedulers;
|
||||
|
||||
@@ -17,44 +18,28 @@ public class LibraryPresenter extends BasePresenter<LibraryFragment> {
|
||||
|
||||
@Inject DatabaseHelper db;
|
||||
@Inject PreferencesHelper prefs;
|
||||
@Inject CoverCache coverCache;
|
||||
@Inject SourceManager sourceManager;
|
||||
|
||||
private Subscription mFavoriteMangasSubscription;
|
||||
private Subscription mDeleteMangaSubscription;
|
||||
private static final int GET_MANGAS = 1;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedState) {
|
||||
super.onCreate(savedState);
|
||||
|
||||
restartableLatestCache(GET_MANGAS,
|
||||
() -> db.getMangasWithUnread().createObservable()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread()),
|
||||
LibraryFragment::onNextMangas);
|
||||
|
||||
start(GET_MANGAS);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onTakeView(LibraryFragment view) {
|
||||
super.onTakeView(view);
|
||||
getFavoriteMangas();
|
||||
}
|
||||
|
||||
public void getFavoriteMangas() {
|
||||
if (mFavoriteMangasSubscription != null)
|
||||
return;
|
||||
|
||||
add(mFavoriteMangasSubscription = db.getMangasWithUnread().createObservable()
|
||||
public void deleteMangas(Observable<Manga> selectedMangas) {
|
||||
add(selectedMangas
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.compose(deliverLatestCache())
|
||||
.subscribe(this.split(LibraryFragment::onNextMangas)));
|
||||
}
|
||||
|
||||
public void onDelete(SparseBooleanArray checkedItems, LibraryAdapter adapter) {
|
||||
if (mDeleteMangaSubscription != null)
|
||||
remove(mDeleteMangaSubscription);
|
||||
|
||||
add(mDeleteMangaSubscription = Observable.range(0, checkedItems.size())
|
||||
.observeOn(Schedulers.io())
|
||||
.map(checkedItems::keyAt)
|
||||
.map(adapter::getItem)
|
||||
.map(manga -> {
|
||||
manga.favorite = false;
|
||||
return manga;
|
||||
})
|
||||
.doOnNext(manga -> manga.favorite = false)
|
||||
.toList()
|
||||
.flatMap(mangas -> db.insertMangas(mangas).createObservable())
|
||||
.subscribe());
|
||||
|
||||
Reference in New Issue
Block a user