Library now showing favorite mangas

This commit is contained in:
inorichi
2015-10-27 00:00:09 +01:00
parent baa24fbf17
commit 35b8be6c75
16 changed files with 78 additions and 42 deletions

View File

@ -21,16 +21,17 @@ public class MangaManagerImpl extends BaseManager implements MangaManager {
super(db);
}
private final String mangasWithUnreadQuery = String.format(
private final String favoriteMangasWithUnreadQuery = String.format(
"SELECT %1$s.*, COUNT(C.%4$s) AS %5$s FROM %1$s LEFT JOIN " +
"(SELECT %4$s FROM %2$s WHERE %6$s = 0) AS C ON %3$s = C.%4$s " +
"GROUP BY %3$s",
"WHERE %7$s = 1 GROUP BY %3$s",
MangasTable.TABLE,
ChaptersTable.TABLE,
MangasTable.TABLE + "." + MangasTable.COLUMN_ID,
ChaptersTable.COLUMN_MANGA_ID,
MangasTable.COLUMN_UNREAD,
ChaptersTable.COLUMN_READ
ChaptersTable.COLUMN_READ,
MangasTable.COLUMN_FAVORITE
);
public Observable<List<Manga>> getMangas() {
@ -47,7 +48,7 @@ public class MangaManagerImpl extends BaseManager implements MangaManager {
return db.get()
.listOfObjects(Manga.class)
.withQuery(RawQuery.builder()
.query(mangasWithUnreadQuery)
.query(favoriteMangasWithUnreadQuery)
.observesTables(MangasTable.TABLE, ChaptersTable.TABLE)
.build())
.prepare()

View File

@ -38,8 +38,8 @@ public class Manga {
@StorIOSQLiteColumn(name = MangasTable.COLUMN_THUMBNAIL_URL)
public String thumbnail_url;
@StorIOSQLiteColumn(name = MangasTable.COLUMN_RANK)
public int rank;
@StorIOSQLiteColumn(name = MangasTable.COLUMN_FAVORITE)
public boolean favorite;
@StorIOSQLiteColumn(name = MangasTable.COLUMN_LAST_UPDATE)
public long last_update;
@ -57,30 +57,6 @@ public class Manga {
public Manga() {}
public Manga(String title) {
this.title = title;
}
public Manga(String title, String author, String artist, String url,
String description, String genre, String status, int rank,
String thumbnail_url) {
this.title = title;
this.author = author;
this.artist = artist;
this.url = url;
this.description = description;
this.genre = genre;
this.status = status;
this.rank = rank;
this.thumbnail_url = thumbnail_url;
}
public static Manga newManga(String title, String author, String artist, String url,
String description, String genre, String status, int rank,
String thumbnail_url) {
return new Manga(title, author, artist, url, description, genre, status, rank, thumbnail_url);
}
public static void copyFromNetwork(Manga local, Manga network) {
if (network.title != null)
local.title = network.title;
@ -107,6 +83,7 @@ public class Manga {
local.thumbnail_url = network.thumbnail_url;
local.initialized = true;
}
@Override

View File

@ -2,9 +2,6 @@ package eu.kanade.mangafeed.data.tables;
import android.support.annotation.NonNull;
/**
* Created by len on 23/09/2015.
*/
public class MangasTable {
@NonNull
@ -41,7 +38,7 @@ public class MangasTable {
public static final String COLUMN_THUMBNAIL_URL = "thumbnail_url";
@NonNull
public static final String COLUMN_RANK = "rank";
public static final String COLUMN_FAVORITE = "favorite";
@NonNull
public static final String COLUMN_LAST_UPDATE = "last_update";
@ -78,7 +75,7 @@ public class MangasTable {
+ COLUMN_TITLE + " TEXT NOT NULL, "
+ COLUMN_STATUS + " TEXT, "
+ COLUMN_THUMBNAIL_URL + " TEXT, "
+ COLUMN_RANK + " INTEGER, "
+ COLUMN_FAVORITE + " INTEGER NOT NULL, "
+ COLUMN_LAST_UPDATE + " LONG, "
+ COLUMN_INITIALIZED + " BOOLEAN NOT NULL, "
+ COLUMN_VIEWER + " INTEGER NOT NULL, "

View File

@ -52,8 +52,12 @@ public class LibraryPresenter extends BasePresenter<LibraryFragment> {
.observeOn(Schedulers.io())
.map(checkedItems::keyAt)
.map(adapter::getItem)
.map(manga -> {
manga.favorite = false;
return manga;
})
.toList()
.flatMap(db::deleteMangas)
.flatMap(db::insertMangas)
.subscribe());
}

View File

@ -17,6 +17,8 @@ public class MangaDetailPresenter extends BasePresenter<MangaDetailActivity> {
@Inject DatabaseHelper db;
private long mangaId;
private Manga manga;
private static final int DB_MANGA = 1;
@Override
@ -24,9 +26,11 @@ public class MangaDetailPresenter extends BasePresenter<MangaDetailActivity> {
super.onCreate(savedState);
restartableLatestCache(DB_MANGA,
this::getDbMangaObservable,
() -> getDbMangaObservable()
.doOnNext(manga -> this.manga = manga),
(view, manga) -> {
view.setManga(manga);
view.setFavoriteBtnVisible(!manga.favorite);
EventBus.getDefault().postSticky(manga);
});
}
@ -41,7 +45,6 @@ public class MangaDetailPresenter extends BasePresenter<MangaDetailActivity> {
private Observable<Manga> getDbMangaObservable() {
return db.getManga(mangaId)
.subscribeOn(Schedulers.io())
.take(1)
.flatMap(Observable::from)
.observeOn(AndroidSchedulers.mainThread());
}
@ -51,4 +54,14 @@ public class MangaDetailPresenter extends BasePresenter<MangaDetailActivity> {
start(DB_MANGA);
}
public void setFavoriteVisibility() {
if (getView() != null) {
getView().setFavoriteBtnVisible(!manga.favorite);
}
}
public boolean addToFavorites() {
manga.favorite = true;
return db.insertMangaBlock(manga).numberOfRowsUpdated() == 1;
}
}

View File

@ -10,7 +10,9 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import butterknife.Bind;
import butterknife.ButterKnife;
@ -32,6 +34,7 @@ public class MangaDetailActivity extends BaseRxActivity<MangaDetailPresenter> {
private MangaDetailAdapter adapter;
private long manga_id;
private boolean is_online;
private MenuItem favoriteBtn;
public final static String MANGA_ID = "manga_id";
public final static String MANGA_ONLINE = "manga_online";
@ -62,12 +65,23 @@ public class MangaDetailActivity extends BaseRxActivity<MangaDetailPresenter> {
getPresenter().queryManga(manga_id);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.manga, menu);
favoriteBtn = menu.findItem(R.id.action_favorite);
getPresenter().setFavoriteVisibility();
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.action_favorite:
onFavoriteClick();
return true;
}
return super.onOptionsItemSelected(item);
}
@ -98,10 +112,22 @@ public class MangaDetailActivity extends BaseRxActivity<MangaDetailPresenter> {
setToolbarTitle(manga.title);
}
public void setFavoriteBtnVisible(boolean visible) {
if (favoriteBtn != null)
favoriteBtn.setVisible(visible);
}
public boolean isOnlineManga() {
return is_online;
}
private void onFavoriteClick() {
if (getPresenter().addToFavorites()) {
Toast.makeText(this, getString(R.string.toast_added_favorites), Toast.LENGTH_SHORT)
.show();
}
}
class MangaDetailAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 2;

View File

@ -101,6 +101,9 @@ public class LoginDialogPreference extends DialogPreference {
if (requestSubscription != null)
requestSubscription.unsubscribe();
if (username.getText().length() == 0 || password.getText().length() == 0)
return;
loginBtn.setProgress(1);
requestSubscription = source.login(username.getText().toString(),